Unzertrennlich, warum mein OpenCL-Kernel mit bestimmten Parametern wird nicht ausgeführt

StackOverflow https://stackoverflow.com/questions/4305133

  •  29-09-2019
  •  | 
  •  

Frage

Ich habe eine OpenCL-Kernel, dass ich in JOCL laufen und es geht mir alle JUnit-Tests. Ich portierte meinen Code in C ++, damit ich den Kernel unter den gleichen Bedingungen Profil könnte. Der Fahrer funktioniert in allen Fällen mit einer Ausnahme. Es läuft völlig in Ordnung in JOCL so dass ich etwas in meinem C ++ Code glaube falsch ist. Mein Code ist unten, ich kann es zum Tode geprüft haben. Wenn jemand kann mir helfen, vor Ort, was falsch ist, ich es schätzen würde.

Der Fahrer Code funktioniert gut mit args 1 und 2 als 8192, arg 3 als 512. Es funktioniert auch gut mit args 1 und 2 512 und 3 arg wie 8192. Arg 4 ist immer nur 1, das setzt den Kernel reale Nummern. Wenn I 1 und args 2-262.144 gesetzt und Arg 3 bis 16 ist, führt es werden keine Fehler gemeldet, keine seg Fehler, aber der Kern, die Daten nicht am Ende geändert werden. Man beachte, dass 1 arg * 3 in allen obigen Fällen gleich 2 ^ 22. Ich glaube, ich bin die gleiche Menge an Schwimmern in allen Fällen zuordnet. Ich bin ratlos. Ich kann nicht OpenCL mir zu sagen, was falsch ist: (

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);

}

War es hilfreich?

Lösung

UPDATE ich es herausgefunden! Das Problem ist in meinem Kernel. Ich verwende konstante Speicher. Mein Java-Code macht dies und manipuliert textlich den Code so, dass, wenn meine Puffergröße für arg 2> 16384, die __constant zu Kontostand ändert. Ich hätte dies gewusst haben, aber ich habe vergessen ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top