1

列の主要な順序で次元 MxN のデバイス マトリックス U があります。ここで、行 K をベクトル u に抽出したいと思います。これを実現する機能はありますか?コピーでは、K のオフセットと M のストライドを考慮する必要があることに注意してください。

関数cudaMemcpy2Dを見ていましたが、より多くの LAPACK スタイルの API から来て、ベルを鳴らしません。これらのピッチ パラメータが何であるか理解できません。単に行と列、または M と N と呼ばれないのはなぜですか?

4

3 に答える 3

2

最初の部分の答えはノーです。GPU 内のメモリは、ホスト側と同様に線形です。列優先順で保存されている 2D 行列の行要素のみにアクセスする場合、結合されていないアクセスのためにコストがかかります。GPU メモリはセグメントで構成されているため、要素にアクセスするたびに、要素自体だけでなく、セグメント内の隣接する要素もフェッチする必要があります。これは、たまたま、要素が存在する列のほとんどの要素である列優先順になっています。行列を行優先の順序で格納し、行の要素にアクセスすると、GPU は同時メモリ要求を最小限のセグメント トランザクションにマージしようとします。
cudaMallocPitchは、2D データの保存に推奨され、メモリ割り当てをパディングして、すべての行/列の開始アドレスを長さで埋めます。widthセグメントの開始アドレスに存在します。その結果、行/列のすべての要素にアクセスすると、フェッチされるセグメントが最小化されます。この方法を使用するコストは、メモリ スペースを浪費することです。

于 2014-01-08T18:47:39.743 に答える
1

@Farzad が指摘したように、必要な操作のメモリ アクセス パターンは非効率的ですが、それ以外は、cudaMemcpy2D を呼び出すことで目的を達成できます (u と U が int 型であると仮定します)。

 cudaMemcpy2D((void*)u, sizeof(int), (void*)(U+K), sizeof(int)*M, sizeof(int), N, cudaMemcpyDeviceToDevice);
于 2014-01-08T19:33:01.840 に答える