我运行Windows 7 64位,CUDA 4.2,Visual Studio 2010中CUDA设备到主机复制很慢
首先,我运行CUDA一些代码,然后下载数据传回主机。然后做一些处理并返回到设备。 然后我做了以下从设备到主机的副本,它运行速度非常快,如1ms。
clock_t start, end;
count=1000000;
thrust::host_vector <int> h_a(count);
thrust::device_vector <int> d_b(count,0);
int *d_bPtr = thrust::raw_pointer_cast(&d_b[0]);
start=clock();
thrust::copy(d_b.begin(), d_b.end(), h_a.begin());
end=clock();
cout<<"Time Spent:"<<end-start<<endl;
完成需要〜1ms。
然后我又在cuda上运行了一些其他代码,主要是原子操作。然后我将设备上的数据复制到主机上,需要很长时间,例如〜9s。
__global__ void dosomething(int *d_bPtr)
{
....
atomicExch(d_bPtr,c)
....
}
start=clock();
thrust::copy(d_b.begin(), d_b.end(), h_a.begin());
end=clock();
cout<<"Time Spent:"<<end-start<<endl;
〜787-9
我的代码多次跑,例如
int i=0;
while (i<10)
{
clock_t start, end;
count=1000000;
thrust::host_vector <int> h_a(count);
thrust::device_vector <int> d_b(count,0);
int *d_bPtr = thrust::raw_pointer_cast(&d_b[0]);
start=clock();
thrust::copy(d_b.begin(), d_b.end(), h_a.begin());
end=clock();
cout<<"Time Spent:"<<end-start<<endl;
__global__ void dosomething(int *d_bPtr)
{
....
atomicExch(d_bPtr,c)
....
}
start=clock();
thrust::copy(d_b.begin(), d_b.end(), h_a.begin());
end=clock();
cout<<"Time Spent:"<<end-start<<endl;
i++
}
的结果几乎相同。
可能是什么问题?
谢谢!
我还是不明白你怎么能''推力:: raw_ptr_cast'与'device_vector'第一个index.I我试图从你的代码运行一个片段,我得到了'错误:类模板的参数列表“推力:: device_ptr“missing missing”error ... – Recker
对不起,我的坏。它应该是int * device_ptr = thrust :: raw_pointer_cast(&d_b [0]);我会更新它。你认为这是造成问题吗?或者我应该直接使用d_b.begin()作为原子操作的输入吗?谢谢! – UserKiwi
你可以发布你能想出的最短重现器吗?我试着从你的代码中做一个简单的例子,但没有看到任何错误。代码中有各种奇怪的语法错误,所以它有助于创建可编译的复制器。 –