/ / Помилка ядра OpenCL -11 - паралельна обробка, opencl

Помилка ядра OpenCL -11 - паралельна обробка, opencl

Я "новачок у OpenCL", і я намагаюся паралелізувати програму виявлення країв. Я намагаюся написати ядро ​​з функції виявлення краю. Оригінальна функція:

void edgeDetection(float *out, float *in, int w, int h) {
int r,c;
for (r = 0; r < h-2; r++) {
for (c = 0; c < w-2; c++) {
float G;
float* pOut = &out[r*w + c];
float Gx = 0.0;
float Gy = 0.0;

int fr,fc;
/* run the 2d-convolution filter */
for (fr = 0; fr < 3; fr++) {
for (fc = 0; fc < 3; fc++) {
float p = in[(r+fr)*w + (c+fc)];
/* X-directional edges */
Gx += p * F[fr*3 + fc];
/* Y-directional edges */
Gy += p * F[fc*3 + fr];
}
}
/* all edges, pythagoral sum */
G = sqrtf(Gx*Gx + Gy*Gy);
*pOut = G;
}
}
}

Моє ядро ​​OpenCL:

__kernel
void edgeDetection(__global float *out,
__global float *in, int w, int h)
{

// Get the work-item’s unique ID
const int r = get_global_id(0);
const int c = get_global_id(1);
if(r>=0 && c>=0 && r<h-2 && c<w-2){
float G;
float* pOut = &out[r*w + c];
float Gx = 0.0;
float Gy = 0.0;

int fr,fc;

for (fr = 0; fr < 3; fr++) {
for (fc = 0; fc < 3; fc++) {

float p = in[(r+fr)*w + (c+fc)];

Gx += p * F[fr*3 + fc];

Gy += p * F[fc*3 + fr];
}
}
G = sqrtf(Gx*Gx + Gy*Gy);
*pOut = G;
}
}

Коли я намагаюся побудувати програму з файлу .cl за допомогою цього (chk - це функція, яка перевіряє наявність помилок / помилок):

status = clBuildProgram(program, 1, &device, NULL, NULL, NULL);
chk(status, "clBuildProgram");

Я отримую повідомлення про помилку: "clBuildProgram не вдалося(-11) ". З моїх досліджень я бачив, що зазвичай вважають, що ця помилка викликана синтаксичною помилкою. Однак після багаторазової перевірки я не бачу нічого особливо неправильного в своєму ядрі. Хтось може допомогти мені зрозуміти, що з цим не так?

Відповіді:

2 для відповіді № 1

У коді є багато помилок:

1)

float* pOut = &out[r*w + c];

Це недійсно, воно повинно бути:

__global float* pOut = &out[r*w + c];

2) Ви використовуєте F в ядрі, яке ніколи не було визначено.

3) sqrtf не визначено в CL, ви мали на увазі sqrt замість цього?