我使用stream和thread控制都只是串行的效果,请教达人解答,不胜感激!
您可以尝试一下cudaSetDevice()。
实际上不仅是调用cuFFT,其他申请显存空间,启动kernel等都可以用cudaSetDevice()来分别指定到不同的GPU上。
具体用法您可以参考下CUDA C Programming Guide 3.2.6.2
祝您好运~
先谢谢哈。cudasetdevice()肯定用过了,不同stream绑定不同的cufft
有成功在多个GPU上实现并发执行FFT的没呀,求指导!
ICE的意思是是说,可能需要楼主您自己切分问题的数据集,然后分别在多个GPU上,用多个host threads分别设置目标设备,然后进行分别计算。
这样,多个设备是“同时”在计算的。
这是我的理解。
以及因为楼主没有说明你的同时并行执行是什么意思。如果楼主是说,想让cufft能自动的同时利用上多个GPU设备,那么可能需要cufft能设计成同时使用多个GPU设备,否则你的这个意思可能无法直接达到。
数据已经切分过了,因为执行向量点乘的操作利用多块卡已经实现速度提升,而对切分好分配到各GPU的4块数据执行FFT却没有,与单卡串行执行4块数据的FFT耗时是一样的
楼主是按照我的建议的方式做的吗?
看到您是4个GPU, 4块数据,那么如果用4个host thread, 每个里面分别设置GPU设备,执行fft,得到结果,然后一并等待4个线程里的工作完成。然后的确发现时间是1在1个设备上执行1份的时间的4倍的话。那我可能无法确定原因了。
建议发下代码?(您可以不发。只是建议)。
您实现过没有嘛?代码在工作电脑上,传不上来
thread和stream的方式都尝试过了
既然如此。那么我不能进一步为您分析问题了。
为了辅助您充分理解我的建议,我给您写了一份Windows下的示范代码,您可以在此基础上改编试验。
include <Windows.h>
include “cuda_runtime.h”
include “device_launch_parameters.h”
struct JobDescriptor
{
int device;
//其他需要传递的数据(可选)
};
DWORD WINAPI Worker(LPVOID argument)
{
struct JobDescriptor *p = (struct JobDescriptor *)argument;
cudaSetDevice(p->device);
//你的一份工作插入这里(例如复制数据过去,计算变换,取回等等)(可选)。
return 0;
}
int main()
{
struct JobDescriptor jobs[4];
HANDLE workers[4];
for (int i = 0; i < 4; i++)
{
jobs[ i ].device = i;
//传递其他字段(可选)
workers[ i ] = CreateThread(NULL, 0, Worker, (LPVOID)&jobs[ i ], 0, NULL);
}
WaitForMultipleObjects(4, workers, TRUE, 0);
//…
}
(好吧。我承认我总是心太软。。嘟嘟)