繁体   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