2010-11-29 2 views
1

JCL에서 실행하는 OpenCL 커널이 있으며 모든 JUnit 테스트를 통과합니다. 내 코드를 C++로 이식하여 동일한 조건에서 커널을 프로파일 링 할 수있었습니다. 드라이버는 1을 제외한 모든 경우에 정상적으로 작동합니다. JOCL에서 완벽하게 실행되기 때문에 C++ 코드에서 잘못된 점이 있다고 생각합니다. 내 코드는 아래에 있습니다. 나는 그것을 감사해야합니다. 누군가가 내가 무엇이 잘못되었는지 알 수 있도록 도와 주시면 감사하겠습니다.내 OpenCL 커널이 특정 매개 변수로 실행되지 않는 이유를 묻습니다.

드라이버 코드는 args 1과 2가 8192, arg 3이 512로 잘 동작합니다. 또한 args 1과 2를 512로, arg 3을 8192로 사용할 수 있습니다. Arg 4는 항상 커널을 설정하는 1입니다. 실수로. args 1과 2를 262144로 설정하고 arg 3을 16으로 설정하면 오류가보고되고 seg faults는 발생하지 않지만 커널은 결국 데이터를 변경하지 않습니다. 위의 모든 경우에서 arg 1 * 3은 2^22와 같습니다. 나는 모든 경우에 같은 양의 수레를 할당하고 있다고 생각한다. 나는 곤두박질 친다. 나는 그것을 알아 낸 나는 OpenCL을 잘못 :(

void HelperFunctions::callKernel(int windowSize, int primitivesPerDataFrame, int nInFramesThisCall, int realOrComplex) 
{ 
// OpenCL Vars 
cl_platform_id platform;  // OpenCL platform 
cl_device_id device;   // OpenCL device 
cl_context gpuContext;   // OpenCL context 
cl_command_queue commandQueue; // OpenCL command queue 
cl_program clProgram;   // OpenCL program 
cl_kernel clkernel;    // OpenCL kernel 
void *dataHostBuffer;  // Host buffer 
void *windowDataHostBuffer;  // Host buffer 
cl_mem inData; // OpenCL device buffer 
cl_mem windowData; // OpenCL device source buffer 
size_t szKernelLength;  // Byte size of kernel code 
cl_int errCode;    // Error code var 

long gridX = 256; 
long gridY = 16384; 
long gridZ = 1; 
size_t global_work_size[] = {gridX, gridY, gridZ}; 
size_t local_work_size[] = {gridX, 1, 1}; 
const char* cSourceCL = NULL;  // Buffer to hold source for compilation 

// Allocate and initialize host arrays 
dataHostBuffer = (void *)malloc(sizeof(cl_float) * primitivesPerDataFrame * nInFramesThisCall); 
windowDataHostBuffer = (void *)malloc(sizeof(cl_float) * windowSize); 

//Populate the data buffers 
dataHostBuffer = generateRampData(primitivesPerDataFrame * nInFramesThisCall); 

windowDataHostBuffer = blackman(windowSize); 

//Get an OpenCL platform 
errCode = clGetPlatformIDs(1, &platform, NULL); 
cout << "Error Code: " << errCode << endl; 

//Get the devices 
errCode = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL); 
cout << "Error Code: " << errCode << endl; 

//Create the context 
gpuContext = clCreateContext(0, 1, &device, NULL, NULL, &errCode); 
cout << "Error Code: " << errCode << endl; 

// Create a command-queue 
commandQueue = clCreateCommandQueue(gpuContext, device, 0, &errCode); 

// Read the OpenCL kernel in from source file 
cSourceCL = oclLoadProgSource("/home/djkasht/workspaceBlueprint/bp/bp-trunk/bundles/CopperShark/src/coppershark/dsp/blocks/opencl/dsp/window/Window.cl", "", &szKernelLength); 

szKernelLength = strlen(cSourceCL); 
// Create the program 
clProgram = clCreateProgramWithSource(gpuContext, 1, (const char **)&cSourceCL, &szKernelLength, &errCode); 
cout << "Error Code: " << errCode << endl; 

// Build the program 
errCode = clBuildProgram(clProgram, 0, NULL, NULL, NULL, NULL); 
cout << "Error Code: " << errCode << endl; 

size_t log_size = 1000000 * sizeof(char); 
char build_log[log_size]; 
size_t len; 
errCode = clGetProgramBuildInfo(clProgram, device, CL_PROGRAM_BUILD_LOG, log_size, build_log, &len); 
cout << build_log << endl; 

// Create the kernel 
clkernel = clCreateKernel(clProgram, "window", &errCode); 
cout << "Error Code: " << errCode << endl; 

// Allocate the OpenCL buffer memory objects 
inData = clCreateBuffer(gpuContext, CL_MEM_READ_WRITE, sizeof(cl_float) * primitivesPerDataFrame * nInFramesThisCall, NULL, &errCode); 
cout << "Error Code: " << errCode << endl; 
windowData = clCreateBuffer(gpuContext, CL_MEM_READ_ONLY, sizeof(cl_float) * windowSize, NULL, &errCode); 
cout << "Error Code: " << errCode << endl; 

// Set the Argument values 
errCode = clSetKernelArg(clkernel, 0, sizeof(cl_mem), (void*)&inData); 
cout << "Error Code: " << errCode << endl; 
errCode = clSetKernelArg(clkernel, 1, sizeof(cl_mem), (void*)&windowData); 
cout << "Error Code: " << errCode << endl; 
errCode = clSetKernelArg(clkernel, 2, sizeof(cl_int), (void*)&windowSize); 
cout << "Error Code: " << errCode << endl; 
errCode = clSetKernelArg(clkernel, 3, sizeof(cl_int), (void*)&primitivesPerDataFrame); 
cout << "Error Code: " << errCode << endl; 
errCode = clSetKernelArg(clkernel, 4, sizeof(cl_int), (void*)&nInFramesThisCall); 
cout << "Error Code: " << errCode << endl; 
errCode = clSetKernelArg(clkernel, 5, sizeof(cl_int), (void*)&realOrComplex); 
cout << "Error Code: " << errCode << endl; 

// Asynchronous write of data to GPU device 
errCode = clEnqueueWriteBuffer(commandQueue, inData, CL_FALSE, 0, sizeof(cl_float) * primitivesPerDataFrame * nInFramesThisCall, dataHostBuffer, 0, NULL, NULL); 
cout << "Error Code: " << errCode << endl; 

// Synchronous/blocking read of results, and check accumulated errors 
errCode = clEnqueueWriteBuffer(commandQueue, windowData, CL_FALSE, 0, sizeof(cl_float) * windowSize, windowDataHostBuffer, 0, NULL, NULL); 
cout << "Error Code: " << errCode << endl; 

errCode = clEnqueueNDRangeKernel(commandQueue, clkernel, 3, NULL, &(global_work_size[0]), &(local_work_size[0]), 0, NULL, NULL); 
cout << "Error Code: " << errCode << endl; 

void* dataHostBuffer2 = (void *)malloc(sizeof(cl_float) * primitivesPerDataFrame * nInFramesThisCall); 
errCode = clEnqueueReadBuffer(commandQueue, inData, CL_TRUE, 0, sizeof(cl_float) * primitivesPerDataFrame * nInFramesThisCall, dataHostBuffer2, 0, NULL, NULL); 

}

답변

2

UPDATE 무엇인지 말해 얻을 수 없습니다! 문제는 내 커널입니다. 나는 상수 메모리를 사용합니다. 내 자바 코드가 차지 이 텍스트를 조작하여 arg 2> 16384에 대한 버퍼 크기가 __constant를 __global으로 변경하면이 사실을 알고 있어야하지만 잊어 버렸습니다.