2017-11-22 6 views
0

助けてください。 1)私はgpuに割り当てられた配列を動かすためにmemcpyを使う必要があります。私はstd :: memcpyを使用することはできません。なぜなら、 "accルーチンはありません"(コンパイル出力)ためです。私のコードはopenaccのデバイス配列にmemcpyを使用

const int GL=100000; 
Particle particles[GL]; 
int cp01[2][GL]; 
#pragma acc declare create(particles,cp01) 
... 

です。私はcudaMemcpyをopenaccで使用できると読んでいます。 function_device()(not able to fill the array allocated on the gpu)に私はCUDAを使用するためのヘッダ

#include <cuda_runtime.h> 

を使用するホスト

#pragma acc data copy(cp) 
{ 
    cudaMemcpy(&particles[cp01[0][0]],&particles[cp01[1][0]],cp*sizeof(Particle),cudaMemcpyDeviceToDevice); 
} 

から呼び出します。

プログラムはコンパイルされますが、動作しません。コンソール回線に出力されずにハングアップします。 デバイスに割り当てられた配列を移動するには(cudaMemcpyを使用するなど)それにはCUDAを使用するのに十分なものが含まれていますか?私はプロジェクトを正しくビルドしますか?(-Mcuda = llvmは必要ですか?) 2)私はまた別の質問を持っている:1は

#pragma acc parallel loop 
for(int i=0; i<N; ++i) 
{...} 

を書き込むと、変数Nは、ホストのみに割り当てなければならないか、それは、GPU上であってもよいですか?

答えて

0

"cudaMemcpy"はデバイスポインタを渡すホスト側の呼び出しなので、 "host_data"ディレクティブを使用します。あなたはホストの値を使いたいので、 "cp"をコピーする必要はありません。また、 "cp01"のホスト値が最新であることを確認してください。

次のような何か:

#pragma acc host_data use_device(particles) 
    { 
    cudaMemcpy(&particles[cp01[0][0]],&particles[cp01[1] [0]],cp*sizeof(Particle),cudaMemcpyDeviceToDevice); 
    } 
関連する問題