Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA |无法使用hostalloc获得高吞吐量_Cuda_Throughput - Fatal编程技术网

CUDA |无法使用hostalloc获得高吞吐量

CUDA |无法使用hostalloc获得高吞吐量,cuda,throughput,Cuda,Throughput,我目前正在学习CUDA,我现在主要关注主机和设备吞吐量之间的内存拷贝。 下面是一个小程序(见下面的注释): 我有3.0的计算能力,并希望达到3.0 GB/s的吞吐量。我已经检查了一点bandWidthTest.cu,但我看不出有什么不同(他们使用的是MemcpyAsync,但正如我所说的,我也尝试了,结果没有什么不同)。 编辑:也许您已经看到来自SDK的测试正在进行大约33MB的传输af。事实上是10次。我试过30*3MB,10*12MB,但没有变化。 那么,我做错了什么呢?问题实际上是其他个人

我目前正在学习CUDA,我现在主要关注主机和设备吞吐量之间的内存拷贝。 下面是一个小程序(见下面的注释):

我有3.0的计算能力,并希望达到3.0 GB/s的吞吐量。我已经检查了一点bandWidthTest.cu,但我看不出有什么不同(他们使用的是MemcpyAsync,但正如我所说的,我也尝试了,结果没有什么不同)。 编辑:也许您已经看到来自SDK的测试正在进行大约33MB的传输af。事实上是10次。我试过30*3MB,10*12MB,但没有变化。
那么,我做错了什么呢?

问题实际上是其他个人计算机进程的问题。我在非显示GPU上试用过,效果很好。

我用代码中的关键带宽部分制作了一个简单的应用程序,就是这样。当我运行该代码时,报告的带宽约为6GB/s,这对于PCIE Gen2 x16链路是正确的(如果bandwidthTest报告为3GB/s,我假设您在Gen1 x16链路或Gen2 x8链路上)。当我在VisualProfiler(nvvp)中运行相同的代码时,在右上角的“DetailGraphs”选项卡中,它还报告了大约6GB/s的最大、平均和最小吞吐量。所以我不清楚你为什么会看到不同。你能试着运行我的代码,看看它报告了什么吗?谢谢你的评论。我编译并运行了您的代码(从终端,使用准无标志进行编译),它输出的带宽=4569.385254 MB/秒,非常好!但是,当我在nvvp中运行使用您的代码生成的可执行文件时,我还看到它被限制为1.54 GB/s,并且。。。等待我重新编译,执行:6 GB/s!再次运行:3!再次运行:1.1..我遗漏了什么吗?设备(流0)应该是同步的。我只是不明白还有什么东西在使用带宽。您正在运行此GPU的显示器吗?也许您应该给出系统设置硬件和软件的完整描述。试着只运行一个拷贝循环(而不是30,您需要更改bw计算中的乘数),看看是否得到更一致的结果。您的系统硬件电源管理也可能根据活动动态更改PCIE链路宽度和/或速度。这会使测量或获得一致的结果变得困难。是的,我也有同样的结论。使用一个拷贝(我将尺寸增加了一倍)可以减少不平稳的结果,大约3.1 GB/s。但是,如果我每秒运行一次,有时(~1/10)会降至1.5 GB/s。我再次运行了带宽测试表单SDK,上面写着5.4 GB/s。(好吧,再一次是2.8,它使用了10次迭代循环)。您认为什么会导致这种波动?我想到的两个主要问题是显示活动和系统电源管理。但你还没有回答我的问题,所以我不会进一步评论。
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;
Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)    Bandwidth(MB/s)
   33554432         3177.5