4
CUDAで非同期memcpyホストをデバイスに実行し、直ちにカーネルを実行したいとします。非同期転送が完了したら、カーネルでどのようにテストできますか?CUDAの非同期memcpy中のデバイス同期
CUDAで非同期memcpyホストをデバイスに実行し、直ちにカーネルを実行したいとします。非同期転送が完了したら、カーネルでどのようにテストできますか?CUDAの非同期memcpy中のデバイス同期
CUDA "ストリーム"を使用して非同期コピーとカーネルの起動をシーケンシングすると、非同期転送が完了した後でカーネルが確実に実行されます。次のコード例は示しています
#include <stdio.h>
__global__ void kernel(const int *ptr)
{
printf("Hello, %d\n", *ptr);
}
int main()
{
int *h_ptr = 0;
// allocate pinned host memory with cudaMallocHost
// pinned memory is required for asynchronous copy
cudaMallocHost(&h_ptr, sizeof(int));
// look for thirteen in the output
*h_ptr = 13;
// allocate device memory
int *d_ptr = 0;
cudaMalloc(&d_ptr, sizeof(int));
// create a stream
cudaStream_t stream;
cudaStreamCreate(&stream);
// sequence the asynchronous copy on our stream
cudaMemcpyAsync(d_ptr, h_ptr, sizeof(int), cudaMemcpyHostToDevice, stream);
// sequence the kernel on our stream after the copy
// the kernel will execute after the copy has completed
kernel<<<1,1,0,stream>>>(d_ptr);
// clean up after ourselves
cudaStreamDestroy(stream);
cudaFree(d_ptr);
cudaFreeHost(h_ptr);
}
そして出力:私はいくつかの非同期状態かどうか(例えば完了としてカーネル内からテストするためにサポートされている任意の方法があります信じていません
$ nvcc -arch=sm_20 async.cu -run
Hello, 13
を非同期転送)が満たされています。 CUDAスレッドブロックは、他の実行スレッドとは完全に独立して実行されると想定されます。
これは、私が欲しいものを達成する方法がないことを意味します。これは悪いことです。なぜなら、最初の部分がmemcpy領域にアクセスせずに実行できるカーネルとそれを必要とする2番目の部分があるため、非同期コピーが実行されるまでカーネルを起動できないからです。これは私にCPUの最初の部分をさせる。 –
問題を独立した部分に分割することは可能ですか?そうであれば、計算を2つのカーネル起動に分割することができます.1つは非同期転送に依存し、もう1つは非同期転送に依存します。 –
でも可能です。実際の問題はありませんので、私はあなたの質問に答えられません。私はちょうど勉強していると私はその質問を得た。 –