14

10 要素の長さの列ベクトル A があります。10 x 10 の行列 B があります。B のメモリ ストレージは列優先です。B の最初の行を列ベクトル A で上書きしたいと思います。

明らかに、私はできる:

for ( int i=0; i < 10; i++ )
{
    B[0 + 10 * i] = A[i];
}

0 + 10 * iここでは、B が列優先のストレージを使用していることを強調するためにゼロを残しました(ゼロは行インデックスです)。

今夜の CUDA ランドでの悪ふざけの後、私は CPU 機能がストライド memcpy を実行する可能性があるのではないかと思いました?? 低レベルでは、パフォーマンスはストライドされたロード/ストア命令の存在に依存すると思いますが、x86アセンブリにあることを思い出しませんか?

4

1 に答える 1

8

簡単な答え: あなたが書いたコードは、最高に高速です。

長い答え:memcpy関数は、任意のサイズとアラインメントを持つメモリ オペランドで動作するため、いくつかの複雑な組み込み関数またはアセンブリを使用して記述されています。行列の列を上書きする場合、オペランドは自然に配置され、適切な速度を得るために同じトリックに頼る必要はありません。

于 2011-05-16T06:27:19.080 に答える