5

C# 配列のサブセットを取得して別のコードに渡す効率的な方法はありますか (元の配列を変更せずに)。配列を GPU にコピーする機能を持つ CUDA.net を使用します。たとえば、配列の 10 分の 1 の関数を渡し、配列の 10 分の 1 ずつを個別に (パイプライン処理の目的で) GPU にコピーしたいと考えています。

この方法で配列をコピーすると、一度にコピーするのと同じくらい効率的になります。安全でないコードを使用して適切なメモリの場所を参照するだけで実行できますが、それ以外はわかりません。CopyTo 関数は配列全体を別の配列にコピーするため、これは役に立ちません。

4

4 に答える 4

12

さて、私は前に質問を誤解していました。

必要なのはSystem.Buffer.BlockCopyまたはSystem.Array.Copyです。

LINQ の方法は恐ろしく非効率的です。コピー先のバッファーを再利用できる場合は、効率も向上し、毎回新しい配列を作成することを回避できます。上部にコピーするだけです。ただし、「大きな」配列を均等に分割できない限り、最後のケースには新しい配列が必要になります。

于 2008-11-06T12:59:50.193 に答える
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
}
于 2008-11-06T12:46:28.833 に答える
1

バイトの配列からアンマネージポインターに移動する必要がある場合は、Marshal.Copyを試すことができます。これにより、安全でないコードを自分で作成することを回避できます。

編集:これは明らかに、APIを再実装した場合にのみ機能します。申し訳ありませんが、誤解されています。効率的なサブアレイメソッドが必要です。

あなたが本当に欲しいのは、フォームの元のクラスのAPIであると私は思います

void CopyToGpu(byte[] source, int start, int length);
于 2008-11-06T13:43:28.453 に答える
0

拡張メソッドを使用してリターンを生成できます。

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
    for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
        yield return array[currentIndex];
}
于 2008-11-06T12:46:53.467 に答える