1

デバイス上に大量の生成データ (A[i,j,k]) がありますが、必要なのは A[i,:,:] の 1 つの「スライス」だけです。通常の CUDA では、これは簡単に実行できます。いくつかのポインター演算で達成されます。

pycuda内で同じことを行うことはできますか? すなわち

cuda.memcpy_dtoh(h_iA,d_A+(i*stride))

(dest 形状から推測されない限り) サイズ情報がないため、明らかにこれは完全に間違っていますが、うまくいけば、アイデアを得ることができますか?

4

2 に答える 2

2

pyCUDA の gpuArray クラスは 1D 配列のスライスをサポートしていますが、ストライドを必要とする高次元はサポートしていません (ただし、今後提供される予定です)。ただし、pycuda.driver.DeviceAllocation 型である gpuarray メンバーから多次元 gpuArray 内の基になるポインターへのアクセスと、gpuArray.dtype.itemsize メンバーからのサイズ情報へのアクセスを取得できます。次に、ドライバーの memcpy 関数が受け入れるものを取得するために、念頭に置いていたのと同じ種類のポインター演算を実行できます。

あまりpythonicではありませんが、機能します(または、少なくとも、昨年pyCUDA + MPIハッキングをたくさん行っていたときに機能しました)。

于 2011-04-19T19:57:22.547 に答える
0

PyCuda で実装されている可能性は低いです。

次の解決策を考えることができます。

  1. 配列A全体をメモリにコピーし、対象のスライスから numpy 配列を作成します。
  2. 行列を読み取り、目的のスライスを作成するカーネルを作成します。
  3. ポインター演算から一度にスライスを読み取ることができるように、生成されたデータを再配置します。
于 2011-04-19T18:53:50.610 に答える