Set kernel argument size to a value > 0

For the case that map or fun is not used in the msr-file, the corresponding
call to the setKernelArg still needs a 2nd argument > 0, otherwise macOS crashes.
This commit is contained in:
2018-12-11 11:35:32 +01:00
parent 24604042e7
commit e6021eb6e3

View File

@ -42,7 +42,7 @@ std::string OpenCLChiSquareRuntime::buildProgram(std::string function) {
if (!fp)
DEBUG_MSG("Can't open kernel file" << kernel_file);
//get file size and allocate memory
//get file size and allocate memory
fseek(fp, 0, SEEK_END);
fsize = ftell(fp);
kernel_source = new char[fsize+1];
@ -52,7 +52,7 @@ std::string OpenCLChiSquareRuntime::buildProgram(std::string function) {
fread(kernel_source, 1, sizeof(char)*fsize, fp);
kernel_source[fsize] = '\0';
fclose(fp);
std::string kernel_string (kernel_source);
return kernel_string + openclFunctHeader + "return " + function + ";" + openclFunctFooter;
@ -76,7 +76,6 @@ int OpenCLChiSquareRuntime::compileProgram(std::string function, bool mlh) {
double OpenCLChiSquareRuntime::calculateSum(cl_mem data, int length) {
int ierr;
//calc number of threads per workgroup and nr of work groups
size_t work_size_sum = (size_t)blockSize_m;
@ -87,7 +86,7 @@ double OpenCLChiSquareRuntime::calculateSum(cl_mem data, int length) {
work_items = (length / work_size_sum + 1) * work_size_sum;
int work_groups = length / work_size_sum + 1;
*/
size_t work_items = 80 * work_size_sum;
int work_groups = 80;
@ -96,19 +95,19 @@ double OpenCLChiSquareRuntime::calculateSum(cl_mem data, int length) {
double *partial_sums = new double[work_groups];
tmp_ptr = m_oclbase->ocl_allocateMemory(work_groups * sizeof(double), ierr);
//execute sum kernel
m_oclbase->ocl_createKernel("parallelReductionTwoPhase");
m_oclbase->ocl_setKernelArg(0, sizeof(cl_mem), &data);
m_oclbase->ocl_setKernelArg(1, sizeof(cl_mem), &tmp_ptr);
m_oclbase->ocl_setKernelArg(2, work_size_sum*sizeof(double), NULL);
m_oclbase->ocl_setKernelArg(3, sizeof(int), &length);
m_oclbase->ocl_setKernelArg(3, sizeof(int), &length);
m_oclbase->ocl_executeKernel(1, &work_items, &work_size_sum);
//read partial sums and free temp mempry
//read partial sums and free temp memory
m_oclbase->ocl_readData(tmp_ptr, partial_sums, sizeof(double)*work_groups);
m_oclbase->ocl_freeMemory(tmp_ptr);
//sumup partial sums on the host
double result = 0;
for (int i = 0; i < work_groups; i++)
@ -157,6 +156,7 @@ int OpenCLChiSquareRuntime::launchChiSquare(int fitType,
return ierr;
//set kernel args
size_t num=1;
m_oclbase->ocl_setKernelArg(0, sizeof(cl_mem), &cl_mem_data);
m_oclbase->ocl_setKernelArg(1, sizeof(cl_mem), &cl_mem_err);
m_oclbase->ocl_setKernelArg(2, sizeof(cl_mem), &cl_param);
@ -172,20 +172,23 @@ int OpenCLChiSquareRuntime::launchChiSquare(int fitType,
m_oclbase->ocl_setKernelArg(12, sizeof(double), &tau_m);
m_oclbase->ocl_setKernelArg(13, sizeof(double), &N0_m);
m_oclbase->ocl_setKernelArg(14, sizeof(double), &bkg_m);
m_oclbase->ocl_setKernelArg(15, sizeof(double)*numpar, NULL);
m_oclbase->ocl_setKernelArg(16, sizeof(double)*numfunc, NULL);
m_oclbase->ocl_setKernelArg(17, sizeof(int)*nummap, NULL);
num = numpar; if (num == 0) num = 1;
m_oclbase->ocl_setKernelArg(15, sizeof(double)*num, NULL);
num = numfunc; if (num == 0) num = 1;
m_oclbase->ocl_setKernelArg(16, sizeof(double)*num, NULL);
num = nummap; if (num == 0) num = 1;
m_oclbase->ocl_setKernelArg(17, sizeof(int)*num, NULL);
if (ierr != DKS_SUCCESS)
return ierr;
} else if (fitType == FITTYPE_ASYMMETRY) {
//create kernel
ierr = m_oclbase->ocl_createKernel("kernelChiSquareAsymmetry");
if (ierr != DKS_SUCCESS)
return ierr;
//set kernel args
size_t num=1;
m_oclbase->ocl_setKernelArg(0, sizeof(cl_mem), &cl_mem_data);
m_oclbase->ocl_setKernelArg(1, sizeof(cl_mem), &cl_mem_err);
m_oclbase->ocl_setKernelArg(2, sizeof(cl_mem), &cl_param);
@ -200,9 +203,12 @@ int OpenCLChiSquareRuntime::launchChiSquare(int fitType,
m_oclbase->ocl_setKernelArg(11, sizeof(double), &timeStep);
m_oclbase->ocl_setKernelArg(12, sizeof(double), &alpha_m);
m_oclbase->ocl_setKernelArg(13, sizeof(double), &beta_m);
m_oclbase->ocl_setKernelArg(14, sizeof(double)*numpar, NULL);
m_oclbase->ocl_setKernelArg(15, sizeof(double)*numfunc, NULL);
m_oclbase->ocl_setKernelArg(16, sizeof(int)*nummap, NULL);
num = numpar; if (num == 0) num = 1;
m_oclbase->ocl_setKernelArg(14, sizeof(double)*num, NULL);
num = numfunc; if (num == 0) num = 1;
m_oclbase->ocl_setKernelArg(15, sizeof(double)*num, NULL);
num = nummap; if (num == 0) num = 1;
m_oclbase->ocl_setKernelArg(16, sizeof(int)*num, NULL);
if (ierr != DKS_SUCCESS)
return ierr;
@ -250,7 +256,7 @@ int OpenCLChiSquareRuntime::writeMap(const int *map, int nummap) {
return ierr;
}
int OpenCLChiSquareRuntime::initChiSquare(int size_data, int size_param,
int OpenCLChiSquareRuntime::initChiSquare(int size_data, int size_param,
int size_func, int size_map)
{
@ -285,7 +291,7 @@ int OpenCLChiSquareRuntime::freeChiSquare() {
ierr = m_oclbase->ocl_freeMemory((cl_mem)mem_param_m);
ierr = m_oclbase->ocl_freeMemory((cl_mem)mem_func_m);
ierr = m_oclbase->ocl_freeMemory((cl_mem)mem_map_m);
initDone_m = false;
}
@ -321,4 +327,3 @@ int OpenCLChiSquareRuntime::checkChiSquareKernels(int fitType, int &threadsPerBl
return ierr;
}