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區域的情況下執行第一部分,而第二部分需要它,則在執行異步複製之前我無法啓動內核。這迫使我做CPU的第一部分。 –
是否可以將問題劃分爲獨立和獨立的部分?如果是這樣,可能會將計算拆分爲兩個內核啓動 - 一個取決於異步傳輸,另一個不啓動。 –
這也是一種可能性。我沒有考慮任何實際問題,所以我無法回答你的問題。我只是在學習,我得到了這個問題。 –