cudaMemcpy 분할 오류
장치에서 호스트로 데이터를 전송하기 위해 cudaMemcpy를 호출할 때 사용자에게 분할 오류가 발생할 수 있습니다. 이는 종종 장치 포인터의 부적절한 처리로 인해 발생합니다.
문제
다음 코드는 문제를 보여줍니다.
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float),\ cudaMemcpyDeviceToHost);
여기서 Grid_dev는 그리드 클래스 객체에 대한 장치 포인터. cudaMemcpy 호출에서 이 포인터를 직접 역참조하려고 시도하면 분할 오류가 발생할 수 있습니다.
해결책
이 문제를 해결하려면 호스트에 중간 포인터를 생성해야 합니다. 장치 포인터를 참조합니다. 다음 코드는 수정된 솔루션을 개략적으로 설명합니다.
float * A; cudaMalloc((void**)&A, sizeof(float)); ... ... cudaMemcpy(&A, &(Grid_dev->cdata[i]), sizeof(float *), cudaMemcpyDeviceToHost); CurrentGrid->cdata[i] = new float[size]; cudaMemcpy(CurrentGrid->cdata[i], A, size*sizeof(float), cudaMemcpyDeviceToHost);
이 수정된 코드에서 A는 처음에 장치 포인터를 가리키는 호스트 포인터입니다. cudaMemcpy를 사용하여 Grid_dev->cdata[i]의 값을 A에 복사함으로써 장치 포인터를 호스트로 효과적으로 전송합니다. 이어서 CurrentGrid->cdata[i]를 호스트의 새로운 부동 소수점 배열에 할당할 수 있으며 데이터는 장치 포인터 A에서 이 배열로 복사될 수 있습니다.
위 내용은 장치에서 호스트로 복사할 때 'cudaMemcpy'가 분할 오류를 일으키는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!