__kernel void CKmix(__global short* MCL, __global short* MPCL,__global short *C, int S, int B)
{
unsigned int i=get_global_id(0);
unsigned int ii=get_global_id(1);
MCL[i]+=MPCL[B*ii+i+C[ii]+S];
}
커널 솔기가 정상적으로 컴파일되고 CPU를 장치로 사용하여 올바른 결과를 얻었지만 커널을 호출 할 때마다 프로그램을 릴리스하고 메모리 개체를 다시 만들었을 때였습니다. 내 테스트 목적으로 약 16000 번입니다.OpenCL : GPU에없는 CPU의 결과를 수정하십시오 : 메모리를 올바르게 관리하는 방법?
내가 게시하는 코드는 고정 된 메모리와 매핑을 사용하려고하는 곳입니다.
OpenCLProgram = clCreateProgramWithSource(hContext[Plat-1][Dev-1],11, OpenCLSource, NULL ,NULL);
clBuildProgram(OpenCLProgram, 0,NULL,NULL, NULL,NULL);
ocKernel = clCreateKernel(OpenCLProgram, "CKmix", NULL);
이것은 또한 성공적입니다. 컨텍스트의 2 차원 배열을 갖는 이유는 모든 플랫폼과 장치를 반복하고 사용자가 사용할 플랫폼과 장치를 선택할 수 있도록하기 위해서입니다.
WorkSize[0]=SN;
WorkSize[1]=NF;
PinnedCCL = clCreateBuffer(hContext[Plat-1][Dev-1], CL_MEM_READ_WRITE| CL_MEM_ALLOC_HOST_PTR, sizeof(short) *NF, NULL, NULL);
PinnedMCL = clCreateBuffer(hContext[Plat-1][Dev-1], CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeof(short) * Z*NF, NULL, NULL);
PinnedMO = clCreateBuffer(hContext[Plat-1][Dev-1], CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeof(short) * Z,NULL, NULL);
PinnedMTEMP = clCreateBuffer(hContext[Plat-1][Dev-1], CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeof(short) * Z,NULL, NULL);
DevComboCCL = clCreateBuffer(hContext[Plat-1][Dev-1], CL_MEM_READ_WRITE, sizeof(short) *NF, NULL, NULL);
DevMappedMCL = clCreateBuffer(hContext[Plat-1][Dev-1], CL_MEM_READ_WRITE , sizeof(short) * Z*NF, NULL,NULL);
DevMO = clCreateBuffer(hContext[Plat-1][Dev-1], CL_MEM_READ_WRITE , sizeof(short) * Z,NULL, NULL);
MO = (short*) clEnqueueMapBuffer(hCmdQueue[Plat-1][Dev-1], PinnedMO, CL_TRUE, CL_MAP_READ, 0, sizeof(short)*Z, 0, NULL, NULL, NULL);
CCL = (short*) clEnqueueMapBuffer(hCmdQueue[Plat-1][Dev-1], PinnedCCL, CL_TRUE, CL_MAP_WRITE, 0, sizeof(short)*NF, 0, NULL, NULL,NULL);
MCL = (short*) clEnqueueMapBuffer(hCmdQueue[Plat-1][Dev-1], PinnedMCL, CL_TRUE, CL_MAP_WRITE, 0, sizeof(short)*Z*NF, 0, NULL, NULL, NULL);
MTEMP = (short*) clEnqueueMapBuffer(hCmdQueue[Plat-1][Dev-1], PinnedMTEMP, CL_TRUE, CL_MAP_READ, 0, sizeof(short)*Z, 0, NULL, NULL, NULL);
for (n=0; n < Z; ++n) {
MTEMP[n]=0;
}
clSetKernelArg(ocKernel, 0, sizeof(cl_mem), (void*) &DevMO);
clSetKernelArg(ocKernel, 1, sizeof(cl_mem), (void*) &DevMCL);
clSetKernelArg(ocKernel, 2, sizeof(cl_mem), (void*) &DevCCL);
clSetKernelArg(ocKernel, 3, sizeof(int), (void*) &SH);
clSetKernelArg(ocKernel, 4, sizeof(int), (void*) &SN);
위의 내용은 내 초기화 작업을 구성하고 아래 나머지 작업은 반복적으로 발생합니다.
clEnqueueWriteBuffer(hCmdQueue[Plat-1][Dev-1], DevMCL, CL_TRUE, 0, Z*NF*sizeof(short), MCL, 0, NULL, NULL);
clEnqueueWriteBuffer(hCmdQueue[Plat-1][Dev-1], DevCCL, CL_TRUE, 0, NF*sizeof(short), CCL, 0, NULL, NULL);
clEnqueueWriteBuffer(hCmdQueue[Plat-1][Dev-1], DevMO, CL_TRUE, 0, Z*sizeof(short), MTEMP, 0, NULL, NULL);
clEnqueueNDRangeKernel(hCmdQueue[Plat-1][Dev-1], ocKernel, 2, NULL, WorkSize, NULL, 0, NULL, NULL);
clEnqueueReadBuffer(hCmdQueue[Plat-1][Dev-1],DevMO, CL_TRUE, 0, Z * sizeof(short),(void*) MO , 0, NULL, NULL);
오류를 확인했으며 오류가 표시되지 않습니다. 커널은 새로운 데이터로 여러 번 반복적으로 시작됩니다. 내가 어디에서 잘못하고 있는지 확실하지 않습니다.
NVIDIA 550 TI 컴퓨팅 능력 2.1, 최신 데브 드라이버, CUDA는 SDK 4.0,
그래서 정확히 무엇이 잘못 될까요? – Grizzly
@ 그리즐리 올바른 결과 (MO)를 얻지 못하고 있습니다. 또한 GPU 대 CPU를 사용하면 다른 결과를 얻습니다. – MVTC
그래서 어떤 결과를 얻고 무엇을 기대 했습니까? – Grizzly