2013-08-18 2 views
1

OpenCL NVIDIA SDK, oclCopyComputeOverlap에 2 개의 대기열을 사용하여 버퍼/실행 커널을 전달하는 예제가 있습니다. 이 예제에서는 매핑 된 메모리가 사용됩니다. 1) 발생하는 중복에 대한 고정 된 메모리를 사용 할 필요가 있는가 :OpenCL 오버랩 통신 및 계산

**//pinned memory** 
cmPinnedSrcA = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, szBuffBytes, NULL, &ciErrNum); 
**//host pointer for pinned memory** 
fSourceA = (cl_float*)clEnqueueMapBuffer(cqCommandQueue[0], cmPinnedSrcA, CL_TRUE, CL_MAP_WRITE, 0, szBuffBytes, 0, NULL, NULL, &ciErrNum); 
... 
**//normal device buffer** 
cmDevSrcA = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, szBuffBytes, NULL, &ciErrNum); 
**//write half the data from host pointer to device buffer** 
ciErrNum = clEnqueueWriteBuffer(cqCommandQueue[0], cmDevSrcA, CL_FALSE, 0, szHalfBuffer, (void*)&fSourceA[0], 0, NULL, NULL); 

나는이 개 질문이? cmPinnedSrcA는 커널에서 사용되지 않음),

fSourceA = (cl_float *)malloc(szBuffBytes); 
... 
//write random data in fSourceA 

2 단순한 호스트 포인터 fSourceA 수 없습니다, 대신 cmDevSrcA이 사용됩니다. 장치의 버퍼가 차지하는 공간이 여전히 증가하지 않습니까? 내가 제대로 질문을 이해하면

당신

답변

1

감사 (cmPinnedSrcA에 필요한 공간이 cmDevSrcA에 필요한 공간에 추가) :

1) 예, 메모리의 종류 (고정을 사용하여 호스트 포인터 등), 오버랩이 계속 발생합니다. 당신이 2 개의 큐를 사용하고 HW/드라이버가 그것을 지원하는 한.

하지만 여전히 대기열은 동기화되지 않습니다. 그리고이 경우 복사 대기열이 실행중인 커널의 일관성이없는 데이터를 복사하지 못하도록 이벤트가 필요합니다.

2) 고정 된 메모리를 사용하는 경우 2 배의 메모리를 사용한다고 생각합니다. 고정 된 메모리와 고정 된 메모리 중 하나를 사용하는 것으로 생각합니다. 하지만 100 % 확실하지는 않습니다. 포인터 일뿐입니다.

+0

답변 해 주셔서 감사합니다. 그러나 나는 여전히 다음을 이해하지 못한다 : 1) 스키마가 다음과 같기 때문에 1) 왜 고정 된 메모리를 사용하고 있는가? 3 개의 고정 된 버퍼, pinnedA, pinnedB, pinnedResult를 생성한다. 고정 된 포인터를 생성, flA, flB, flResult; 3 개의 정상 버퍼 A, B, Result를 생성합니다. 호스트 포인터 flA에서 A (절반 크기)로 쓰기, 큐 1에서 flB에서 B (절반 크기) 쓰기, 큐 1에서 커널 K1 대기열에 넣기, flA에서 A로 쓰기 (다른 반쪽), flB에서 쓰기 대기열 2의 B (나머지 절반); – user2694398

+0

대기열에서 대기열 1의 결과 (처음 절반)에서 flResult로 읽기, 대기열 2에서 대기열 K2에 대기열에 추가, 큐 2에서 결과를 큐에 넣으십시오 (나머지 절반). 커널은 A, B, 결과만을 버퍼로 사용합니다. 2) 고정 된 버퍼 (pinnedA, pinnedB, pinnedResult)의 크기를 참조하여 다른 버퍼의 크기 (A, B, Result)를 추가했습니다. 어쨌든, 너무 빨리 대답 해 주셔서 다시 감사합니다. – user2694398

+0

고정 된 작동 방식을 자세히 알지 못합니다. 그러나 그 사용법은 고정 된 메모리의 전형적인 방법입니다. – DarkZeros