2011-08-03 63 views
2

我正在爲不同大小的數據運行主機到設備bandwidthtests,並且注意到主機內存針對可分頁時被增加的帶寬。以下是我以MB/s爲單位的帶寬與以字節爲單位的數據傳輸大小的關係圖。人們可以注意到,對於少量的數據(< 300K),可分頁的票價優於固定...是否與O/S的內存分配有關? 這個帶寬測試程序來自NVidia的代碼示例sdk(稍加修改),我正在使用CUDA 4.0對Tesla C2050進行測試。 O/S是64位Linux。CUDA用於小數據的固定內存

enter image description here

回答

1

爲了儘可能實現最佳吞吐量,cudaMemcpy實現針對不同設備,源和目標位置以及數據大小具有不同的代碼路徑。

您所看到的不同速率可能是由於數組大小更改時的實現切換所致。例如,Fermi GPU具有專用複製引擎(可以與運行在SM上的內核並行運行),以及可以通過PCI-e訪問主機內存的SM。對於較小的陣列,可以將cudaMemcpy作爲在SM上運行的內核來實現,這些內核可以直接讀取主機內存並將加載的數據存儲在設備內存中(反之亦然),因此驅動程序可以選擇執行此操作。或者使用複製引擎可能更有效 - 我不確定它在實踐中的作用,但我認爲在它們之間切換是您在圖形中看到交叉的原因。

0

這可能是測試是一種欺騙行爲。

下面是定時碼之一:

cutilSafeCall(cudaEventRecord(start, 0)); 
if(PINNED == memMode) 
{ 
    for(unsigned int i = 0; i < MEMCOPY_ITERATIONS; i++) 
    { 
     cutilSafeCall(cudaMemcpyAsync(h_odata, d_idata, memSize, 
           cudaMemcpyDeviceToHost, 0)); 
    } 
} 
else 
{ 
    for(unsigned int i = 0; i < MEMCOPY_ITERATIONS; i++) 
    { 
     cutilSafeCall(cudaMemcpy(h_odata, d_idata, memSize, 
           cudaMemcpyDeviceToHost)); 
    } 
} 
cutilSafeCall(cudaEventRecord(stop, 0)); 

注意,該測試使用不同的功能,爲不同類型的內存做的memcpy。我認爲,這是一種欺騙,因爲模式之間的主要區別在於內存如何分配,其中cudaHostAlloc用於固定,而malloc用於未固定。

不同的Memcpy函數可以有不同的錯誤檢查和傳輸設置路徑。

因此,嘗試修改測試並在cudaMemcpy()(例如,並將cudeEventRecord(...)之後的所有ifs更改爲if(0 && (PINNED == memMode))

+0

謝謝你解釋,但我使用'cudaMemcpy(...)'固定和可分頁的分配。 – Sayan

+0

而對於原始的「作弊」代碼,結果如何? – osgx

+3

上面的代碼是來自測試,但是您遺漏的是在最後一行之後,它在停止主計時器之前調用cudaDeviceSynchronize()。這確保了整個複製成本是定時的,並且bandwidthTest不會「欺騙」。 – harrism