Ошибка локального размера в функции NDRangeKernel в OpenCL - PullRequest
0 голосов
/ 28 марта 2012

Когда я увеличиваю значение локального размера путем умножения на 2, я получаю ошибку, хотя globalsize / localsize является целым числомЯ не мог понять, в чем проблема.

    Kernel:
     __kernel void add(__global float *a,
                   __global float *b,
                   __global float *answer,
                   __local float *shared,
                   __local float *result)
   {
      int gid = get_global_id(0);
      int lid = get_local_id(0);
      int lsize = get_local_size(0);

      float tempa, tempb;
      shared[lid]   = a[gid];
      shared[lid + lsize]   = b[gid];
      barrier(CLK_LOCAL_MEM_FENCE);

      for(int k = 0; k < lsize; k++){
        tempa = shared[lid + k];
        tempb = shared[lid + lsize + k];
        result[lid + k] = tempa + tempb;
      }
      barrier(CLK_LOCAL_MEM_FENCE);

      answer[gid] = result[lid];
    }

Допустим, локальный размер равен 2 ^ n.Если n <5, то программа работает, иначе она вылетает.Хост-код в C: </p>

size_t global_work_size = n;    //n = 1000000
size_t local_work_size = 32;
size_t sharedSize = (2 * local_work_size) * sizeof(float);
size_t resultSize = local_work_size * sizeof(float);

err =  clSetKernelArg(kernel, 0, sizeof(cl_mem), &cmDevBufInA);  //HERE
err |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &cmDevBufInB);
err |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &cmDevBufOut);
err |= clSetKernelArg(kernel, 3, sharedSize, NULL);
err |= clSetKernelArg(kernel, 4, resultSize, NULL);
assert(err == CL_SUCCESS);

//EXECUTION AND READ
cl_event calculation;


err = clEnqueueNDRangeKernel(cmd_queue, kernel, 1, NULL, &global_work_size, &local_work_size,0, NULL, &calculation);
assert(err == CL_SUCCESS);
clFinish(cmd_queue);

1 Ответ

1 голос
/ 01 апреля 2012

Какое максимальное значение для 'lid + lsize + k' tempb = shared [lid + lsize + k];

Lid = 31 lsize = 32 k = 32

, но совместно используемоевыделяется как

size_t sharedSize = (2 * local_work_size) * sizeof (float);

...