我目前正在学习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是一个宏(在这种情况下是浮点数)。仅使用一个流(主流)。在这种情况下我不使用Async,这不是重点。 (我已尝试但吞吐量不会改变)。
通过这个小测试,我认为是正确的(并提供了正确的数值结果),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,但没有变化。 那么,我做错了什么?
答案 0 :(得分:0)
问题实际上是其他个人计算机流程。我试过非显示GPU,它工作正常。