質問
(元の配列を変更せずに)C#配列のサブセットを取得して別のコードに渡す効率的な方法はありますか? GPUに配列をコピーする機能を持つCUDA.netを使用します。私は例えば関数に配列の10番目を渡し、配列の各10番目を個別にGPUにコピーします(パイプライン化のため)。
この方法で配列をコピーすると、一度にコピーするのと同じくらい効率的です。安全でないコードと適切なメモリ位置を参照するだけで実行できますが、それ以外はわかりません。 CopyTo関数は、配列全体を別の配列にコピーするため、有用ではないようです。
解決
さて、前に質問を誤解していました。
必要なのは System.Buffer.BlockCopy または System.Array.Copy 。
LINQの方法はひどく非効率的です。コピー先のバッファを再利用できる場合は、効率も向上し、毎回新しい配列を作成する必要がなくなります-上にコピーするだけです。 「ビッグ」を分割できない限り、同様に配列しますが、最後のケースでは新しいものが必要になります。
他のヒント
これがどれほど効率的かはわかりませんが...
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
}
バイト配列からアンマネージポインターに移動する必要がある場合は、Marshal.Copyを試すことができます。これにより、安全でないコードを自分で作成する必要がなくなります。
編集:これは明らかに、APIを再実装する場合にのみ機能します。申し訳ありませんが、誤解されています。効率的なサブ配列メソッドが必要です。
本当に欲しいのは、フォームの元のクラスのapiであることに気づきます
void CopyToGpu(byte[] source, int start, int length);
拡張メソッドを使用してreturnを生成できます:
public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
yield return array[currentIndex];
}
所属していません StackOverflow