cudaMemcpy 분할 오류: 통찰력 및 문제 해결
cudaMemcpy가 잘못된 메모리 주소에서 작동할 때 "cudaMemcpy 분할 오류" 오류가 자주 발생합니다. 이 문제를 자세히 알아보기 위해 게시된 문의의 특정 예에 집중하겠습니다.
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float),\ cudaMemcpyDeviceToHost);
코드 및 디버그 정보를 조사한 결과 Grid_dev->cdata[i] 포인터가 NULL인 것으로 확인되었습니다. cudaMemcpy 호출에서 역참조될 때 분할 오류가 발생했습니다.
디바이스를 역참조하는 이유 포인터 실패
cudaMemcpy 호출에 장치 포인터를 사용할 수 있지만 포인터는 장치 주소만 저장한다는 점을 기억하는 것이 중요합니다. 장치의 실제 데이터에 액세스하려면 추가 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로. 그런 다음 cudaMemcpy A를 호스트로 보냅니다. 이렇게 하면 포인터 값을 직접 역참조하려고 시도하는 대신 포인터 값을 캡처할 수 있습니다.
잠재적 메모리 누수
포인터 A가 다음과 같은 경우 수정된 코드에서 메모리 누수가 발생할 수 있습니다. 데이터 복사 작업 후 해제되지 않습니다. 이를 완화하려면 cudaFree(A)를 사용하여 A에 할당된 메모리를 해제해야 합니다.
위 내용은 NULL 장치 포인터를 역참조할 때 cudaMemcpy가 분할 오류를 일으키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!