[英]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.