2012-07-23 88 views
4

我對我看到的關於阻塞和cudaMemcpy的一些評論感到困惑。據我瞭解,費米HW可以同時執行內核並執行cudaMemcpy。cudaMemcpy&blocking

我讀過Lib func cudaMemcpy()是一個阻塞函數。這是否意味着func會阻止進一步的執行,直到副本完全完成?或者這是否意味着直到以前的內核完成才能開始複製?

例如此代碼是否提供相同的阻止操作?

SomeCudaCall<<<25,34>>>(someData); 
cudaThreadSynchronize(); 

VS

SomeCudaCall<<<25,34>>>(someParam); 
cudaMemcpy(toHere, fromHere, sizeof(int), cudaMemcpyHostToDevice); 
+0

我如何知道哪些呼叫是阻塞的,哪些不是?我在庫描述中沒有看到任何說「我是阻塞API調用」的東西。即,在cudaMemcpy描述中沒有提及阻塞。 (也許我在找錯地方?) – Doug 2012-07-23 22:15:49

回答

5

你的例子是等價的。如果你想異步執行,你可以使用流或上下文和cudaMemcpyAsync,這樣你就可以將執行與拷貝重疊。

+0

cudaMemcpy在其複製操作之前是否提供了阻塞,然後呢?即我知道在複製操作開始之前內核已經完成嗎?還是在複製操作的「結束」時發出阻止信號,表示內核已完成且複製完成? – Doug 2012-07-23 21:52:21

+0

單個流中的操作不會重疊(它們始終以串行方式執行)。因此,在單個流中,memcpy/asyncMemcpy/kernels將在所有先前操作(內核或其他memcpys)完成後啓動。 – 2012-12-16 08:07:43

2

根據NVIDIA的編程指南:

爲了方便主機和設備之間的併發執行,一些函數調用是異步的:在設備完成請求的任務之前,控制返回到主線程。它們是:

  • 內核啓動;
  • 內存在兩個地址之間複製到相同的設備內存;
  • 從主機到64KB或更少內存塊的設備的內存拷貝;
  • 由帶有Async後綴的函數執行的內存副本;
  • 內存集函數調用。

因此,只要您的傳輸大小大於64KB,您的示例是等效的。