> 백엔드 개발 > C++ > 장치에서 호스트로 복사할 때 'cudaMemcpy'가 분할 오류를 일으키는 이유는 무엇이며 어떻게 해결할 수 있습니까?

장치에서 호스트로 복사할 때 'cudaMemcpy'가 분할 오류를 일으키는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Patricia Arquette
풀어 주다: 2024-12-03 21:47:12
원래의
154명이 탐색했습니다.

Why Does `cudaMemcpy` Cause a Segmentation Fault When Copying from Device to Host, and How Can I Fix It?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿