2012-12-12 3 views
0

openCL 프로그램에서 비정상적인 동작이 나타납니다.OpenCL에서 메모리를 잘못 복사했습니다.

프로그램의 호스트 부분에서 나는 double 배열을 만들고 모든 원소를 0으로 설정합니다.

errNum = clEnqueueReadBuffer(commandQueue, memObjects[4], CL_TRUE, 0, 
          I_numel * sizeof(double), I, 0, NULL, NULL); 

그러나 일부 : 내가있는 호스트로 다시 읽어 다음

memObjects[4] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, 
          sizeof(double) * I_numel, I, NULL); 
어떤 조건에 따라 일부 요소가 1로 설정되어있는 커널 내부

과 : 그 배열을 사용하여 GPU에 복사 0 일 것으로 예상되는 요소의 수는 매우 작게 (6.953267903e-310) 또는 매우 큰 수 (2.0002319483e + 161)로 변경되었습니다.

double을 float로 변경해 보았지만 결과는 비슷합니다. OpenCL의 nvidia 구현을 사용하고 있습니다. 버전은 1.1입니다. 누구가 문제인지 아는 사람 있습니까?

답변

0

커널 코드에 문제가 있다고 생각됩니다. 커널을 전혀 실행하지 않고 clEnqueueRead 만 수행하면 모든 0이 생깁니 까? CL_MEM_COPY_HOST_PTR을 삭제하고 대신 clEnqueueWrite로 버퍼를 지우는 방법은 어떻습니까? 예상대로,

나는이 단순화 된 커널 문제를 재현하려고했으나 출력은 0과 1을 교류했다 :

kernel void enqueueReadBuffer(global float* outputValueArray) { 
    int gid = get_global_id(0); 
    if (gid % 2 == 0) { 
    outputValueArray[gid] = 1.0f; 
    } 
} 

내가 엔비디아 쿼드로를 포함하여, Windows 7에서 세 가지의 OpenCL 드라이버에서이 작업을 실행 FX4800 (R307.45), 그리고 그들 모두에 대한 정확한 결과를 얻었다.

+0

복사에 대한 게시! 메모리 복사에 문제가 있습니다! 이 간단한 예를 살펴보십시오. – user1894442

+0

double a [10];for (int i = 0; i <10; ++ i) a [i ++] = i + 0.5; cl_mem memObj = NULL; memObj = clCreateBuffer (context, CL_MEM_READ_WRITE, sizeof (double) * 10, NULL, NULL); errNum = clEnqueueWriteBuffer (commandQueue, memObj, CL_TRUE, 0, 10 * sizeof (double), a, 0, NULL, NULL); errNum = clEnqueueReadBuffer (commandQueue, memObj, CL_TRUE, 0, 10 * sizeof (double), a, 0, NULL, NULL); std :: cout.precision (10); for (int i = 0; i <10; ++ i) std :: cout << a [i ++] << "" "; std :: cout << std :: endl; I 얻을 – user1894442

+0

출력은 : I 얻을 0.5 2.5 4.5 6.5 8.5 – user1894442

0

이 함께 표시된 코드를 교체 시도하고 ERR 번호

cl_int err; 
memObjects[4] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, 
          sizeof(double) * I_numel, I, &err); 

printf("Buffer creation error no = %d", err); 

그리고 커널은 확실히 문제입니다 다시

cl_int err2; 
err2= clEnqueueReadBuffer(commandQueue, memObjects[4], CL_TRUE, 0, 
          I_numel * sizeof(double), I, 0, NULL, NULL); 
printf("Copy back error no = %d", err2); 
관련 문제