2013-09-26 12 views
0

Я пишу программу raytracing в OpenCL, и у меня есть функция в моем ядре, Quadratic, которая принимает 3 плавающих переменных и два указателя на значения float.Доступ к переменной по указателю в ядре OpenCL

Функция:

bool Quadratic(float A, float B, float C, float *t0, float *t1) { 
    float discrim = B * B - (4.0 * A * C); 
    if (discrim <= 0.0) return false; 
    float rootDiscrim = sqrtf(discrim); 
    float q; 
    if (B < 0) q = -0.5f * (B - rootDiscrim); 
    else q = -0.5f * (B + rootDiscrim); 
    *t0 = q/A; 
    *t1 = C/q; 
    float temp; 
    return true; 
} 

Вызов функции:

float t0; 
float t1; 
if (Quadratic(A, B, C, &t0, &t1)) c[(i*dimy)+j] = t0; 
else c[(i*dimy)+j] = 0.0; 

Выдает следующую ошибку:

pyopencl.RuntimeError: clBuildProgram failed: build program failure - 
Build on <pyopencl.Device 'ATI Radeon HD 6750M' on 'Apple' at 0x1021b00>: 
Error returned by cvms_element_build_from_source 

Пытаясь выяснить, что проблема была я создал следующий тест функция, которая, как представляется, работает:

bool TestFunc(float Y, float *x) { 
    *x = Y; 
    return true; 
} 

float x; 
if (TestFunc(50.0, &x)) c[(i*dimy)+j] = x; 

Насколько я понимаю, обе функции имеют одинаковые типы входов и выходов, любая помощь будет принята с благодарностью.

+1

Используйте clGetProgramBuildInfo(), чтобы получить подробную информацию об ошибке. Это прямо указывает на проблему типа «sqrt(), которая не определена». – DarkZeros

ответ

0

Оказалось, что проблема заключалась в использовании sqrtf. После изменения на sqrt он отлично работает.