2014-05-12 2 views
0

많은 빈 매개 변수를 사용하여 빈 커널을 시작하려고하지만 enqueueNDRangeKernel 함수에서 메모리 액세스 위반이 있습니다. 내 코드를 확인하십시오. 아마도 뭔가를 놓쳤거나 알지 못했을 것입니다.OpenCL enqueueNDRangeKernel에서 액세스 위반 오류

호스트 코드 : https://dl.dropboxusercontent.com/u/71256314/main.cpp 처음에는 초기화를 한 다음 버퍼를 만든 다음 인수를 설정합니다. 오류가 나오지 않습니다. 첫 번째 enqueueNDRangeKernel 함수 호출에서 충돌합니다.

커널 코드 : https://dl.dropboxusercontent.com/u/71256314/baum_kernel.cl 커널이 비어 있어도 작동하지 않습니다.

버퍼에 문제가 있지만 오류가 반환되지 않습니다.

버전 : AMD APP SDK v2.8 버전 - 12.10 GPU (9.002) ™ AMD 촉매 : ATI 모빌리티 라데온 HD 5650

+1

컴파일 링 및 라이브러리 연결을 확인하십시오. 프로그램이 OpenCL에 제대로 연결되어 있지 않은 것 같습니다. API는 그런 식으로 절대로 충돌해서는 안됩니다. – DarkZeros

+0

@DarkZeros이게 문제라고 생각하지 않습니다. VS 2012에서 프로젝트를 설정 한 것처럼 여기에 (x64 시스템 용) : http://kode-stuff.blogspot.ru/2012/11/setting-up-opencl-in-visual-studio_1.html I 이 구성으로 간단한 helloworld 예제를 실행하려고 시도했지만 제대로 작동했습니다. –

+0

Hello World 예제는 쓸모가 없다고 말하면서 아무것도 실행하지 않는 OpenCL의 함수를 호출합니다 (일부 ID 만 리턴). 작동하더라도 링크가 잘못되었을 수 있습니다. 발생하는 오류의 일반적인 문제는 잘못된 라이브러리 버전으로 연결하거나 잘못된 방식으로 동적으로로드하는 것입니다. – DarkZeros

답변

1

1) 문제가 줄을이었다가

err = kernel.setArg(11, Otr); checkErr(err, "Kernel::setArg()11"); 

내가 통과했다 포인터를 사용하여 해당 OpenCL 버퍼 Otr_b를 setArg 함수에 전달하는 대신 Otr을 부동시킵니다. OpenCL은 버퍼를 기다리고있는 커널에 포인터를 복사하려고 시도했습니다. 의심의 여지가 액세스 위반 오류가 발생했습니다.


2) DarkZeros으로 언급 한 또 다른 중요한 점 : 또한 라이브러리 연결 및 ATI 드라이버와 AMD APP SDK 사이 버전 대응을 확인합니다. 다음은 드라이버 및 SDK 호환성이 나열된 링크입니다 (Versions of AMD APP SDK). 제 경우에는 12.10 (9.002) 드라이버와 호환되지 않는 AMD APP SDK v2.8.1이있었습니다. 나는 v2.8.0 버전을 결국 설치했다.

관련 문제