CL_INVALID_KERNEL_NAME: когда структура в ядре (Opencl) - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь выполнить упражнение n-Body для OpenCL.Я использую структуру для своей функции bodyForce, и мне нужно предоставить ее экземпляр в качестве аргумента функции.Теперь я пытаюсь объявить структуру в моем файле ядра, потому что мое ядро ​​не знает структуру (очевидно), но затем я получаю эту ошибку OpenCL:

#define CL_INVALID_KERNEL_NAME                      -46
  • Я проверил имя ядра иэто соответствует
  • Я изменил имя моего ядра на другое
  • Я использовал заголовочный файл, указатель const char и только что реализовал структуру в моем файле ядра

CODE:

Настройка Opencl:

...
m_addKernel = clCreateKernel(m_program, "bodyForce", &err);
if (err != CL_SUCCESS)
{
    cout << err << endl;
    cout << "Error occured: clCreateKernel" << endl;
}
...

srcKernel.cl:

__kernel
typedef struct { float x, y, z, vx, vy, vz; } Body;
void bodyForce(__global Body *p, __global float *dtt, __global int *nn){
   float dt = *dtt;
   int n = *nn;
   for (int i = 0; i < n; i++) {
       float Fx = 0.0f; float Fy = 0.0f; float Fz = 0.0f;
       for (int j = 0; j < n; j++) {
            float dx = p[j].x - p[i].x;
            float dy = p[j].y - p[i].y;
            float dz = p[j].z - p[i].z;
            float distSqr = dx * dx + dy * dy + dz * dz + 1e-9f;
            float invDist = 1.0f / sqrtf(distSqr);
            float invDist3 = invDist * invDist * invDist;

        Fx += dx * invDist3;
        Fy += dy * invDist3;
        Fz += dz * invDist3;
    }

    p[i].vx += dt * Fx;
    p[i].vy += dt * Fy;
    p[i].vz += dt * Fz;
}

}

Я не думаю, что что-то еще важноно если я что-то пропустил, то дайте мне знать!

Заранее спасибо.


Обновление:

Если я установлю свою структуру выше моего __kernel следующим образом:

typedef struct { float x, y, z, vx, vy, vz; } Body;
__kernel
void bodyForce(__global Body *p, __global float *dtt, __global int *nn){
...
}

Тогда я получаю это сообщение об ошибке:

ptxas application ptx input, line 94; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 135; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 176; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 222; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 259; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 296; error   : Type of argument does not match formal parameter '%VAParam'
ptxas application ptx input, line 333; error   : Type of argument does not match formal parameter '%VAParam'
ptxas fatal   : Ptx assembly aborted due to errors

1 Ответ

0 голосов
/ 17 декабря 2018

Вам нужно поставить атрибут __kernel перед определением функции:

typedef struct { float x, y, z, vx, vy, vz; } Body;

__kernel
void bodyForce(__global Body *p, __global float *dtt, __global int *nn) {
}
...