2011-08-11 54 views

回答

8

使用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線程塊完全獨立於其他執行線程執行。

+0

好吧,這意味着沒有辦法實現我想要的。這很糟糕,因爲如果我有一個內核可以在不訪問memcpy區域的情況下執行第一部分,而第二部分需要它,則在執行異步複製之前我無法啓動內核。這迫使我做CPU的第一部分。 –

+1

是否可以將問題劃分爲獨立和獨立的部分?如果是這樣,可能會將計算拆分爲兩個內核啓動 - 一個取決於異步傳輸,另一個不啓動。 –

+0

這也是一種可能性。我沒有考慮任何實際問題,所以我無法回答你的問題。我只是在學習,我得到了這個問題。 –