2011-10-23 4 views
1

플래그가 CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE 플래그로 생성되었습니다. 하나의 커널에서 이것을 사용하고 버퍼가 생성 될 때 호스트 메모리 세트로 데이터를 다시 다운로드했습니다 (queue.enqueueReadBuffer(...)). 이 데이터를 CPU에서 수정 했으므로 다른 커널에서이 데이터를 사용하고 싶습니다. 논 블로킹 쓰기를 사용하여 데이터를 수동으로 업로드 한 후 (queue.enqueueWriteBuffer)이 버퍼를 인수로 사용하여 대기열에 추가하면 CL_OUT_OF_RESOURCES 오류가 반환됩니다. 블로킹 쓰기는 괜찮았다.순서없는 큐에 논 블로킹 쓰기

왜 이런 일이 발생 했습니까? 나는 블로킹/비 블로킹 버전이 enqueueWriteBuffer 호출이 리턴 된 후 CPU의 메모리로 작업 할 수있는 경우에만 제어한다고 생각하고, 순서 대기열과 함께 커널에 차이가 없어야합니다. 두 번째 질문은 수동으로 업로드해야하는지 여부입니다. CL_MEM_USE_HOST_PTR은 일부 커널이 버퍼를 인수로 사용할 때마다 데이터가 호스트에서 장치로 업로드되어야한다는 것을 의미합니까? 데이터를 수동으로 다운로드해야하므로 위에서 언급 한 플래그가 있습니다.

감사

답변

1

나는 당신의 CL_OUT_OF_RESOURCES 오류에 대한 특정 문제를 확신 할 수 없다. 이 오류는 시스템의 문제에 대한 일종의 catch-all로 발생하는 것으로 보이므로 실제로 발생하는 오류는 프로그램의 다른 부분 (아마 커널)에 의해 발생할 수 있습니다.

CL_MEM_USE_HOST_PTR과 관련하여 여전히 수동으로 데이터를 업로드해야합니다. OpenCL 사양은 다음과 같이 명시합니다.

이 플래그는 host_ptr이 NULL이 아닌 경우에만 유효합니다. 지정되면, 은 응용 프로그램이 객체의 메모리 비트로 host_ptr이 참조하는 메모리 인 메모리를 OpenCL 구현에서 사용하기를 원함을 나타냅니다. OpenCL 구현은 장치 메모리의 host_ptr이 가리키는 버퍼 내용을 캐시 할 수 있습니다. 이 캐시 된 사본은 커널이 장치에서 실행될 때 이 사용될 수 있습니다.

일부 장치의 경우 데이터가 장치 메모리에 캐시됩니다. 데이터를 동기화하려면 clEnqueueReadBuffer/clEnqueueWriteBuffer 또는 clEnqueueMapBuffer/clEnqueueUnmapBuffer을 사용해야합니다. 개별 CPU + GPU 조합 (즉, 별도의 GPU 카드)의 경우 데이터가 어쨌든 캐시되므로 CL_MEM_USE_HOST_PTR 일 때 어떤 이점이 있는지 확신 할 수 없습니다. 사양을 읽고시

대신 clEnqueueReadBuffer/ clEnqueueWriteBufferclEnqueueMapBuffer/ clEnqueueUnmapBuffer를 사용하기위한 몇 가지 성능상의 이점이있을 수 있습니다,하지만 난 실제 장치에 대해이 테스트하지 않았습니다.

행운을 빈다.