楼主提过的stream,我觉得不是很靠谱。我实际使用中感觉流……
[/Quote]
在另一个论坛上看到有人提到这个是用单线程控制多个GPU的,但具体方法不详(http://cudabbs.it168.com/thread-234-1-1.html)
关于stream我也没用过,只是从看到的一些资料的推测
关于"stream没有具体控制在哪个device上执行的参数",我的理解是,这是反过来做的
也就是,先cudaSetDevice(),然后创建当前设备的stream,而后将内核执行或者存储拷贝发射到当前的流,
如此实现多个设备上的多个流的运行:
cudaSetDevice(0); // Set device 0 as current
cudaStream_t s0;
cudaStreamCreate(&s0); // Create stream s0 on device 0
MyKernel<<<100, 64, 0, s0>>>(); // Launch kernel on device 0 in s0
cudaSetDevice(1); // Set device 1 as current
cudaStream_t s1;
cudaStreamCreate(&s1); // Create stream s1 on device 1
MyKernel<<<100, 64, 0, s1>>>(); // Launch kernel on device 1 in s1
或者再进一步,不再考虑流直接这样做:
cudaSetDevice(0); // Set device 0 as current
MyKernel_0<<<100, 64, 0>>>(); // Launch kernel on device 0
cudaSetDevice(1); // Set device 1 as current
MyKernel_1<<<100, 128, 0>>>(); // Launch kernel on device 1
这样可不可以呢?因为好像MyKernel_0发射完成后,HOST段就立即获得返回值了吧,也就是可以继续进行了吧(是不是?)然后就可以选择另一个设备发射MyKernel_1了吧,这样不就是同时两个device上都有kernel在运行?