2010-11-29 15 views
1

私はJCLLで実行する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フォルトも報告されませんが、カーネルは最後にデータを変更しません。上記のすべての場合の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を得ることができない、私はそれを考え出した!問題は私のカーネルである。私は一定のメモリを使用しています。私のJavaコードが占めこれは文字通りにコードを操作するので、arg 2> 16384のバッファサイズで__constantを__globalに変更すると、私はこれを知っていたはずですが、忘れてしまいました...

関連する問題