我想通過this article中所述的CUDA感知MPI在不同CUDA設備之間交換數據。據我瞭解,下面的代碼應該做的工作:使用CUDA感知MPI的要求
#include <mpi.h>
int main(int argc, char *argv[])
{
int rank;
float *ptr = NULL;
const size_t elements = 32;
MPI_Status status;
MPI_Init(NULL, NULL);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
cudaMalloc((void**)&ptr, elements * sizeof(float));
if(rank == 0)
MPI_Send(ptr, elements, MPI_FLOAT, 1, 0, MPI_COMM_WORLD);
if(rank == 1)
MPI_Recv(ptr, elements, MPI_FLOAT, 0, 0, MPI_COMM_WORLD, &status);
cudaFree(ptr);
MPI_Finalize();
return 0;
}
不幸的是,這個程序有段錯誤崩潰時,在兩個進程執行,給予以下消息:
*** Process received signal ***
Signal: Segmentation fault (11)
Signal code: Address not mapped (1)
Failing at address: 0x210000
[ 0] /lib64/libc.so.6[0x39d94326a0]
[ 1] /lib64/libc.so.6(memcpy+0xd2)[0x39d9489742]
[ 2] /usr/lib64/openmpi/lib/libopen-pal.so.6(opal_convertor_pack+0x18e)[0x2b750326cb1e]
[ 3] /usr/lib64/openmpi/lib/openmpi/mca_btl_smcuda.so(mca_btl_smcuda_sendi+0x3dc)[0x2b7507c2252c]
[ 4] /usr/lib64/openmpi/lib/openmpi/mca_pml_ob1.so(+0x890f)[0x2b75086ec90f]
[ 5] /usr/lib64/openmpi/lib/openmpi/mca_pml_ob1.so(mca_pml_ob1_send+0x499)[0x2b75086ed939]
[ 6] /usr/lib64/openmpi/lib/libmpi.so.1(PMPI_Send+0x1dd)[0x2b7502d3ef8d]
[ 7] prog(main+0x98)[0x400d51]
[ 8] /lib64/libc.so.6(__libc_start_main+0xfd)[0x39d941ed5d]
[ 9] prog[0x400be9]
*** End of error message ***
我用的openmpi 1.8.2和nvcc 6.5;據我所知,這些版本應該支持這個功能。
所以,我的問題是:我做錯了什麼?我錯過了一些觀點嗎?我非常感謝任何關於如何獲得最小工作示例的提示!
我對此並不瞭解,但按照簡單的邏輯,爲什麼不檢查'cudaMalloc()'中分配的成功或者它不是必需的? –
我檢查了一下,發現這不是問題。一般來說,我同意支票是一個好主意,但在這裏我只是試圖保持代碼簡短。 – piripiri