2014-03-25 2 views
0

우선 OpenCL의 초보자이며 컴퓨터 과학에 대한 강한 배경이 없기 때문에 내가 배운 것이 아닙니다.OpenCL의 전체 메모리 제한

그래서 디지털 지형 모델 (DTM)이 주어진 지평선을 계산하는 도구를 작성하고 있습니다. 이를 위해 데이터 병렬화가 가능하지 않거나 접근법을 찾을 수 없기 때문에 OpenCL을 태스크 병렬 접근 방식으로 사용합니다.

나는 각자 360 도의 수평선 (또는 파노라마 또는 무엇이든 그것을 부르길 원하는 부분)을 계산하는 8 개의 커널을 가지고있다. 그 뒤에있는 수학은 아주 간단합니다. 특정 방향의 한 픽셀에서 선을 따라 가며 높이를 찾습니다. 그런 다음 360 방향의 모든 픽셀에 대해이를 반복하십시오.

요점은 내가 성공하는 것이지만 한 가지를 발견했습니다. 더 작은 DTM을 사용하면 올바른 결과를 얻는 것처럼 보입니다. 그러나 매우 큰 DTM을 사용하면 커널 내부에 들어 가지 않습니다.

큰 문제는 다음과 같습니다. 이것이 발생하는 이유가 무엇입니까? 3 ~ 4GB의 데이터를 GPU에 보낼 수 있습니까? 나는 4GB의 글로벌 데이터를 보유 할 수있는 방법이 없기 때문에 기본 데이터를 무시하고 있습니까? 데이터를 커널에 대한 포인터로 보내므로 잘못하지 마십시오.

감사합니다.

UPDATE :

오류 난 모든 단계를 확인되지 않았 음을 참이었다. 내가 CL_MEM_OBJECT_ALLOCATION_FAILURE 오류가있어 그래서 내 메모리 개체의 크기를 어떻게 든 축소해야 할 것 같아요. 모두에게 감사 드려요!

+1

주어진 설명에서 알기는 어렵지만 가능한 문제는 다음과 같습니다. * 단일 메모리 할당의 최대 크기에 대한 제한이 있습니다 - 'clDeviceGetInfo' 및'CL_DEVICE_MAX_MEM_ALLOC_SIZE'를 검색하십시오. 또한 메모리 조각화는이 크기를 초과하지 않아도 문제를 일으킬 수 있습니다. 그리고 세 번째 : 이전에 프로그램에 등장했을지도 모르는 오류를 * 엄격하게 검사하고 있습니까? (OpenCL에서 오류를 검사하는 것은 지루할 수 있으므로 불행히도 사람들이 그것을 생략하는 경향이 있습니다 ...) – Marco13

+0

어떤 GPU를 사용하고 있습니까? 어디에서 오류가 발생합니까? 이것을 모른 채 추측하는 것만 가능합니다. –

+0

@ Marco13 나는 모든 오류를 점검하고 있다고 생각하지만 내일 사무실에서 보게 될 것입니다. 나 또한 당신이 나를 도울 수 있도록 몇 가지 코드를 붙여 넣을 것입니다. 감사! – Ramayer

답변

0

먼저 OpenCL API 호출의 결과를 확인해야합니다. "커널 안에 들어 있지도 않다"라는 경우 API 호출 중 하나가 놓친 오류 값이 반환됩니다.

둘째, 버퍼 크기 (및 다른 많은 값)에는 실제로 제한이 있습니다. OpenCL은 각 값의 최소 한도를 지정하지만 장치에 따라 다르므로 clGetDeviceInfo을 사용하여 특정 장치에 최대 값을 요청해야합니다.

+0

내일 사무실에서 나는 모든 오류를 재확인 할 것입니다. 만약 내가 뭔가를 놓친 경우를 대비하여 clGetDeviceInfo를 점검 할 것입니다. 감사! – Ramayer

+0

오류는 실제로 모든 단계를 확인하지 못했습니다. 내가 CL_MEM_OBJECT_ALLOCATION_FAILURE 오류가있어 그래서 내 메모리 개체의 크기를 어떻게 든 축소해야 할 것 같아요. 모두에게 감사 드려요! – Ramayer