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입니다. 누구가 문제인지 아는 사람 있습니까?
복사에 대한 게시! 메모리 복사에 문제가 있습니다! 이 간단한 예를 살펴보십시오. – user1894442
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
출력은 : I 얻을 0.5 2.5 4.5 6.5 8.5 – user1894442