2017-03-10 75 views
3

例如...這是我在NVIDIA的文檔,請參閱:如何知道cudaMemcpyAsync已完成讀取主機內存?

cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); 
kernel<<<grid, block>>>(a_d); 
cpuFunction(); 

讓我們說這是包裝在一個函數...

void consume() { 
    cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0); 
    kernel<<<grid, block>>>(a_d); 
} 

如果我也有一個功能

void produce() { 
    // do stuff 
    a_h[0] = 1; 
    a_h[1] = 3; 
    a_h[2] = 5; 
    //... 
} 

如果我稱之爲:

produce(); 
consume(); 
produce(); // problem?? 

第二產()將開始在a_h

更改主機上的內存我怎麼知道CUDA是不是還異步內存拷貝程序中讀取主機內存?

如何在不中斷異步存儲副本的情況下安全地寫入主機a_h內存?

編輯---

我知道我可以叫cudaDeviceSynchronize()cudaStreamSynchronize()但也將等待kernel完成。我寧願不要等到kernel完成。

我想盡快寫信給主機a_h,而不是等待kernel完成。

回答

5

如果您使用流調用cudaMemcpyAsync,則可以在異步傳輸後向流中插入事件,然後使用cudaEventSynchronize來同步該事件。這可以確保副本已經完成,但不依賴於設備處於空閒狀態或流爲空。

+0

我剛剛閱讀有關cuda的活動。謝謝!! – tmsimont

相關問題