簡體   English   中英

CUDA | 使用hostalloc無法獲得高吞吐量

[英]CUDA | Cannot get high throughput using hostalloc

我目前正在學習CUDA,現在我專注於主機和設備吞吐量之間的內存副本。 這是一個小程序(請參閱下面的注釋):

int NX=1000;
int NY=800;

int size=NX*NY;
size*=sizeof(PREC);
int threadsperbloc=512;
int blockspergrid=ceil(NX*NY/threadsperbloc);

//Allocate and instanciate host arrays
PREC *h_a;
PREC *h_b;
h_a=new PREC[NX*NY];
h_b=new PREC[NX*NY];
for (int i=0;i<NX*NY;i++){
    h_a[i]=i;
    h_b[i]=i;
}
//Allocate device arrays and a paged-locked host array to fetch results
PREC *d_a=NULL;
PREC *d_b=NULL;
PREC *d_c=NULL;
PREC *dh_c=NULL;
CUDA_CHECK(cudaMalloc(&d_a,size));
CUDA_CHECK(cudaMalloc(&d_b,size));
CUDA_CHECK(cudaMalloc(&d_c,size));
CUDA_CHECK(cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice));
CUDA_CHECK(cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice));
CUDA_CHECK(cudaHostAlloc(&dh_c,size,cudaHostAllocDefault));

//A little addition vector addition on the device
vecadd<<<blockspergrid,threadsperbloc>>>(d_a, d_b, d_c, NX*NY);

//Repeating copies from device to page-locked host memory
for(int t=0;t<30;t++){
    CUDA_CHECK(cudaMemcpy(dh_c,d_c,size,cudaMemcpyDeviceToHost));
}
cout<<"Check : "<<h_a[1000]<<" + "<< h_b[1000]<<" = "<<dh_c[1000]<<endl;

注意:PREC是一個宏(在這種情況下為float)。 僅使用一個流(主要流)。 在這種情況下,我不使用異步,這不是重點。 (我已經嘗試過,但是吞吐量沒有改變)。

通過這個我認為是正確的小測試(並提供了正確的數值結果),Visual Profiler告訴我,我的吞吐量僅為1.52 GB / s(帶有“注意”圖標),每次傳輸大約3MB(僅用於信息)。 但是,使用SDK中的NVIDIA bandWidthTest卻說

Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)    Bandwidth(MB/s)
   33554432         3177.5

我具有3.0計算能力,並且還希望實現3.smth GB / s的吞吐量。 我已經檢查了bandWidthTest.cu,但看不到我在做什么(它們使用的是MemcpyAsync,但正如我所說,我也嘗試了沒有不同的結果)。 編輯:也許您已經看到來自SDK的測試正在進行約33MB的傳輸。 實際上是10倍。 我嘗試了30 * 3MB,10 * 12MB,但沒有任何變化。 那么,我在做什么錯呢?

問題實際上出在其他個人計算機進程上。 我嘗試在非顯示GPU上正常運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM