2013年09月05日

__device__変数間のコピー

デバイス間でメモリのコピーが上手く出来なかった.
D_aをD_bにコピーしたかったのですが,cudaMemcpyFromSymbol(D_b, D_a, sizeof(H_a), 0, cudaMemcpyDeviceToDevice);とすると引数エラーに.
cudaMemcpyToSymbolFromSymbol()的な扱いを想定していたんだけど.


いろいろ悩んだりおちんこだりしたけれど,とりあえず,Symbolのアドレス取得して,そのアドレスを使ってCudaMemcpyさせました.
CudaでのSymbolの取り扱いを理解できていないから,よく間違えるんだろうなぁ.


double H_a[110][110][110];
__device__ double D_a[110][110][110];
__device__ double D_b[110][110][110];

main(){
my_cudaSafeCall(cudaMemcpyToSymbol( D_a, H_a, sizeof(H_a)));
double *symbol_from, *symbol_to;
my_cudaSafeCall(cudaGetSymbolAddress((void **)&symbol_from, D_a));
my_cudaSafeCall(cudaGetSymbolAddress((void **)&symbol_to, D_b));
// my_cudaSafeCall(cudaMemcpyFromSymbol(D_b, D_a, sizeof(H_a), 0, cudaMemcpyDeviceToDevice));//ここで11 Invalid argument
my_cudaSafeCall(cudaMemcpy(symbol_to, symbol_from, sizeof(H_a), cudaMemcpyDeviceToDevice));
my_cudaSafeCall(cudaMemcpyFromSymbol(H_a, D_b, sizeof(H_a)));
}
posted by にゃんこ at 23:17| Comment(326) | TrackBack(0) | CUDA C