如何实现多核使用CUFFT

我在进行程序调试的时候发现需要多个GPU节点并行计算,那么是否有类似MPI的多个GPU之间直接通讯的编译环境?CUFFT是否可以支持利用多个GPU节点共同计算?

LZ您好:

1:不存在此类“编译环境”以及MPI也不是此类“编译环境”。
2:您可以先分割您的问题,然后通过某种通信手段在节点间传递数据,这样既可实现多个节点的并行计算。

3:CUFFT只能实现单个GPU上的FFT计算,如果您不是需要计算一个超级大的FFT,那么您可以采取任务划分的方式,在不同的节点上跑不同的子任务。

大致如此,祝您好运~

谢谢您的回答,我就是需要一个很大的FFT,看样子比较难实现了。。。。

LZ您好:

根据CUDA 5.0附带的CUFFT的手册中的说法,CUFFT支持最大3D的FFT变换,每个维度最多128 million个单精度元素或者64 million个双精度元素。以及受到GPU显存的大小的限制。

您可以参照一下这个计算规模限制。
如果仅是受到显存限制,那么可以考虑使用大显存的GPU。

或者您也可以从算法方面考虑。

祝您好运~

我是受到了显存的限制,一个节点只有64G。。。
感谢您的帮助,我也想知道一下是否有GPU到GPU之间的直接数据传输函数?我看的书里没有提到这一点。导致我只能从CPU绕路。。。

LZ您好:

1:您一个GPU节点64GB显存应当是多个GPU的,单个GPU应该更小。CUFFT库一次只能用一个GPU所属的显存的。

2:telsa系列GPU有GPU Direct技术可供使用,但是多个节点之间事实上您只能通过CPU再通过网络中转的。

祝您好运~

外部媒体

这是我使用的GPU节点结构,GPU加速卡是NVIDIA Tesla Kepler K20M。怎么看出来一个GPU所属的显存是多少?这个64GB应该代表了我在GPU上能开辟的空间是64GB吧?

LZ您好:

您的一块K20的显存是5GB的(GDDR5),您直接开辟显存空间不能超过这个值的。

图中的64GB指的是您一个节点的计算机系统里面CPU所共享的内存大小。这个按照CUDA中的概念指的是host memory。

以及这个64GB虽然写成“shared memory”,但是请您明白,这个是针对CPU而言的,您的两枚CPU共享了这64GB的内存,构成一个“共享内存系统”。但是这个“shared memory”并不是CUDA概念中的“shared memory”,后者是一种GPU上的高速缓存,容量很小的。

大致如此,供您参考。

祝您好运~

十分感谢!我明白了。