2008-11-06 15 views
5

क्या सी # सरणी का सबसेट लेने का एक प्रभावी तरीका है और इसे कोड के दूसरे चोटी (मूल सरणी को संशोधित किए बिना) पास कर सकता है? मैं CUDA.net का उपयोग करता हूं जिसमें एक फ़ंक्शन है जो GPU को सरणी कॉपी करता है। मैं उदाहरण देना चाहता हूँ फ़ंक्शन को सरणी का 10 वां पास करें और इस प्रकार प्रत्येक 10 वीं सरणी को GPU को अलग से कॉपी करें (पाइपलाइनिंग उद्देश्यों के लिए)।सरणी सबसेट कुशलतापूर्वक प्राप्त करना

इस तरह से सरणी की प्रतिलिपि बनाना उतना ही कुशल होना चाहिए जितना इसे एक बार में कॉपी करना। यह असुरक्षित कोड के साथ किया जा सकता है और उचित स्मृति स्थान का संदर्भ दे रहा है लेकिन इसके अलावा मुझे यकीन नहीं है। CopyTo फ़ंक्शन पूरे सरणी को किसी अन्य सरणी में प्रतिलिपि बनाता है ताकि यह उपयोगी दिखाई न दे।

उत्तर

11

ठीक है, मैं पहले प्रश्न गलत समझा था।

आप क्या चाहते हैं System.Buffer.BlockCopy या System.Array.Copy

LINQ तरीके बेहद अक्षम होंगे। यदि आप उस बफर का पुन: उपयोग करने में सक्षम हैं जिसमें आप प्रतिलिपि बना रहे हैं, तो यह दक्षता में भी मदद करेगा, प्रत्येक बार एक नई सरणी बनाने से परहेज करें - बस शीर्ष पर कॉपी करें। जब तक आप अपने "बड़े" सरणी को समान रूप से विभाजित नहीं कर सकते हैं, तब भी आपको अंतिम मामले के लिए एक नया आवश्यकता होगी।

3

मुझे यकीन है कि यह कैसे कुशल है, लेकिन नहीं कर रहा हूँ ...

int[] myInts = new int[100]; 

//Code to populate original arrray 

for (int i = 0; i < myInts.Length; i += 10) 
{ 
    int[] newarray = myInts.Skip(i).Take(10).ToArray(); 
    //Do stuff with new array 
} 
0

आप विस्तार के तरीकों और उपज वापसी इस्तेमाल कर सकते हैं:

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex) 
{ 
    for (var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex) 
     yield return array[currentIndex]; 
} 
+0

यही अच्छा के मूल कक्षा में एक API है, लेकिन कुशल नहीं thats, एक Array.Copy बहुत तेजी से किया जाएगा। –

+0

किस तरह से यह कुशल नहीं है? यदि आप केवल सरणी के हिस्सों में पुन: प्रयास करना चाहते हैं, तो यह एक सरणी की प्रतिलिपि बनाने से अधिक कुशल है। –

+0

क्षमा करें इसे सही तरीके से समझाएं। पुनरावृत्ति के लिए आप सही हो सकते हैं लेकिन 'उपज' का उपयोग करते समय बहुत सारे ऑपरेशन होते हैं। लेखक के प्रश्न लेखक हैं कि ऊपर वर्णित विधि का उपयोग करते समय, एक सरणी के एक सबसेट को जीपीयू में कॉपी करने के लिए, आपको 'ToArray()' को कॉल करने की आवश्यकता है जो कि भयानक अक्षम होगा। विधि खराब नहीं है लेकिन इस उद्देश्य के लिए अच्छा नहीं है imho। –

1

आप मार्शल को आजमा सकते हैं। यदि आपको बाइट्स की एक सरणी से एक अप्रबंधित सूचक से जाना है। यह स्वयं को असुरक्षित कोड बनाने से बचाता है।

संपादित करें: यह स्पष्ट रूप से केवल तभी काम करेगा यदि आप उनके एपीआई को दोबारा लागू करते हैं। क्षमा करें - गलत समझा। आप एक कुशल subarray विधि चाहते हैं।

यह मेरे हमलों है कि क्या आप वास्तव में चाहते हैं प्रपत्र कुछ प्रयोजनों के लिए

void CopyToGpu(byte[] source, int start, int length); 
संबंधित मुद्दे