質問

(元の配列を変更せずに)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];
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top