似たような質問を検索してみましたが、似たようなタイトルの質問がいくつかありますが、見つかりませんでした。
ホストに次のようなコードがあります。
handle_error(cudaMalloc((void**)&ret_dev, FLOAT_SIZE*no_kstrings*M));
for(int div=0;div<no_kstrings/threads;div++){
kernel<<<grid_dim,block_dim>>>(ret_dev, v_freq_vectors, &no_kstrings[threads]);
handle_error(cudaMemcpy(&exp_freq[threads], ret_dev, FLOAT_SIZE*threads*M,
cudaMemcpyDeviceToHost));
}
基本的に、ループ内のコードを最大数の倍数として実行する必要があります。ブロックあたりのスレッド数。そして、カーネル関数は単に何かを行い、データを に入れますret_dev
。だから私は疑問に思っていcudaMemcpy()
ました、各反復の後に行う必要がありますか、それともループの外でも行うことができますか? このようなもの:
handle_error(cudaMalloc((void**)&ret_dev, FLOAT_SIZE*no_kstrings*M));
for(int div=0;div<no_kstrings/threads;div++){
kernel<<<grid_dim,block_dim>>>(ret_dev, v_freq_vectors, &no_kstrings[threads]);
}
handle_error(cudaMemcpy(exp_freq, ret_dev, FLOAT_SIZE*no_kstrings*M,
cudaMemcpyDeviceToHost));
私が聞きたいのは、同じ引数でカーネル関数を複数回呼び出すと、それらの引数が何らかの形で破損するのでしょうか?
ありがとう