或许大家在写程序的时候,会遇到多GPU编程的问题,这里我简单的介绍一下方法:
- 主线程用cudaSetDevice()函数切换不同的设备
- linux下使用pthread实现多GPU
以上两种方法都可以实现多GPU的编程,但是区别还是很大的!比如使用第一种方法,有两块GPU的情况下,我们把任务分在不同的GPU上,执行的时候需要:
cudaSetDevice(0);
lanuch_kernel1<<<...>>>(...);
cudaSetDevice(1);
lanuch_kernel2<<<...>>>(...);
cudaSetDevice(0);
cudaMemcpy(...);
cudaSetDevice(1);
cudaMemcpy(...);
这样虽然在内核执行的时候是并行的,但是在内存拷贝的时候是串行的。因为cudaMemcpy是同步拷贝函数,CPU执行到这里必须等待GPU完成所有工作后才能进行内存拷贝。
接下来换种方法,在linux下使用pthread来实现多GPU并行。
pthread_t *thread = (pthread_t *)malloc(sizoef(pthread_t)*devCnt);
for(int i=0; i<devCnt; i++)
pthread_create(&thread[i], NULL, lanuch_kernel, (void*)param);
//注意这里的lanuch_kernel并非CUDA内核函数,而是一个线程调用的函数,参数将通过param传递到函数内
for(int i=0; i<devCnt; i++)
pthread_join(thread[i], NULL);
在当今多核CPU遍布天下的时代,每个线程会占用一个核心来执行,那么此时内核会并行执行,而内存拷贝也是并行的,消耗的时间会比方法1要少!(pthread的用法请各位自行查阅资料~)
以上是经过我实际测试的,大家可以参考!
除此以外还有OPENMP和MPI的方式,也可以在单节点使用多GPU(OPENMP没试过,我只用MPI)。