Gau*_*rav 2 cuda gpgpu multi-gpu
我有这样的代码:
for(int i =0; i<2; i++)
{
//initialization of memory and some variables
........
........
RunDll(input image, output image); //function that calls kernel
}
Run Code Online (Sandbox Code Playgroud)
上述循环中的每次迭代都是独立的.我想同时运行它们.所以,我试过这个:
for(int i =0; i<num_devices; i++)
{
cudaSetDevice(i);
//initialization of memory and some variables
........
........
RunDll(input image, output image);
{
RunBasicFBP_CUDA(parameters); //function that calls kernel 1
xSegmentMetal(parameters); //CPU function
RunBasicFP_CUDA(parameters); //function that uses output of kernel 1 as input for kernel 2
for (int idx_view = 0; idx_view < param.fbp.num_view; idx_view++)
{
for (int idx_bin = 1; idx_bin < param.fbp.num_bin-1; idx_bin++)
{
sino_diff[idx_view][idx_bin] = sino_org[idx_view][idx_bin] - sino_mask[idx_view][idx_bin];
}
}
RunBasicFP_CUDA(parameters);
if(some condition)
{
xInterpolateSinoLinear(parameters); //CPU function
}
else
{
xInterpolateSinoPoly(parameters); //CPU function
}
RunBasicFBP_CUDA( parameters );
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用2 GTX 680,我想同时使用这两个设备.有了上面的代码,我没有得到任何加速.处理时间与在单个GPU上运行时的处理时间几乎相同.
如何在两个可用设备上实现并发执行?
在评论中你说:
RunDll有两个内核,它们是逐个启动的.内核确实有cudaThreadSynchronize()
请注意,这cudaThreadSynchronize()
相当于cudaDeviceSynchronize()
(前者实际上已弃用),这意味着您将在一个GPU上运行,同步,然后在另一个GPU上运行.另请注意,这cudaMemcpy()
是一个阻塞例程,您需要该cudaMemcpyAsync()
版本以避免所有阻塞(正如评论中@JackOLantern所指出的那样).
一般情况下,您需要发布更多有关内部信息的详细信息,RunDLL()
因为您的问题没有足够的信息来提供明确的答案.理想情况下遵循这些准则.
归档时间: |
|
查看次数: |
149 次 |
最近记录: |