2013-07-11 4 views
2

그래서 내가 MPI를 사용하여 여러 컴퓨터에 걸쳐 배포되는 OpenCL을 사용하여 구현하려는 응용 프로그램이 있습니다.OpenCL 부분 버퍼 DMA 읽기/쓰기

이제 알고리즘을 반복 할 때마다 MPI 프로세스간에 버퍼를 동기화해야하지만 여기에서는 catch가 있습니다. 2D 버퍼의 경계 만 전체 영역이 아닌 동기화/복사해야합니다. 이 읽기/ 전체 버퍼의 전체 복사본을 유발하지 않고 2D 버퍼 의 테두리를 작성하는 오픈 CL의 메모리 매핑 메커니즘 (clEnqueueMapBuffer & clEnqueueUnmapMemObject)와 가능하다면

그래서 제 질문입니다.

기본적으로 OpenCL이 호스트 측 버퍼 복사본 대신 DMA를 사용하는 경우에만 작동합니다. 그래서 제 질문은 OpenCL이 개별적인 PCIe GPU에서 장치 버퍼 데이터의 DMA 액세스를 지원하는지 여부입니다. 그리고 그렇다면 어떤 하드웨어와 운영 체제에 있습니까?

답변

3

DMA를 사용하려면 버퍼가 페이지 잠금 메모리에 있어야합니다. AMD와 NVIDIA는 프로그래밍 가이드에서 페이지 잠김 메모리에 버퍼를 갖기 위해 CL_MEM_ALLOC_HOST_PTR 플래그로 생성해야한다고 말합니다. 여기에 NVIDIA가 guide:

의 OpenCL 애플리케이션 3.3.1 메모리 객체가 페이지 잠금 메모리에 할당 여부와 관계없이 직접 제어가없는 절에서 말씀이지만, 그들은 를 사용하여 개체를 만들 수 있습니다 CL_MEM_ALLOC_HOST_PTR 플래그와 그러한 객체 은 최상의 성능을 위해 드라이버가 페이지 잠금 메모리에 할당 할입니다.

"굵은 글꼴"에 유의하십시오.

어떤 OS입니까? NVIDIA는 OS에 대해 말하지 않기 때문에 어떤 OS NVIDIA도 드라이버를 제공합니다 (AMD에서도 마찬가지입니다).
어떤 하드웨어가 있습니까? 모든 DMA 컨트롤러가있는 것 같습니다.

clEnqueueWriteBufferRect() 

이 기능은 버퍼의 2 또는 3D 영역으로 쓸 수 : 이제

당신이 function에 모습을 가질 수있는 버퍼의 일부를 작성합니다. 또 다른 가능성은 function로를 만드는 서브 버퍼를 사용하는 것입니다 :

clCreateSubBuffer() 

그러나 그것으로 2D 버퍼의 어떤 개념이 없습니다.

+0

clEnqueueWriteBufferRect/clEnqueueReadBufferRect 내가 뭘 찾고 있었는지, 감사합니다. –