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;
}
불행하게도,이 프로그램은 두 개의 프로세스에서 실행하는 경우, 세그먼트 폴트로 추락 다음과 같은 메시지 제공 : 내가 OpenMPI 실행을 사용
*** 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 ***
을 내가 알고있는 것처럼, 다음 코드는 일을한다고 1.8.2 및 nvcc 6.5; 내가 아는 한,이 버전들은이 기능을 지원하기로되어있다.
내 질문은 : 내가 뭘 잘못하고있는거야? 나는 어떤 점을 놓치고 있는가? 최소 작업 예제을 얻는 방법에 대한 모든 힌트를 매우 감사드립니다!
나는 이것에 익숙하지 않지만 간단한 논리에 따라'cudaMalloc()'에서 할당 성공 여부를 확인하지 않거나 필요하지 않은 이유는 무엇입니까? –
그 점을 확인해 보니 이것이 문제가되지 않습니다. 일반적으로 나는 수표가 좋은 생각이라는 것에 동의하지만 여기에서는 간단하게 코드를 짧게하려고 노력했다. – piripiri