файл opencl c не компилируется - PullRequest
0 голосов
/ 06 октября 2011

Вопрос: Чего не хватает в объявлении этой функции / ядра, которое мешает его компиляции?


Информация:

__kernel void square(
   __global float* input,
   __global float* output,
   const unsigned int count)
{
int i = get_global_id(0);
if(i < count)
    output[i] = input[i] * input[i];
}

Приведенный выше фрагмент кода компилируется на моей видеокарте. Я заставил это работать, но я решил по причинам обслуживания, что было бы лучше переместить код из строки в моем файле в отдельный файл и просто прочитать его, ничего необычного. Я полагал, что теоретически я должен быть в состоянии скомпилировать этот код, независимо от того, выполняется он или нет, но, по крайней мере, отладить его в gcc и командной строке, а затем во время выполнения с моим gpu.

но приведенный выше код просто дает мне ошибку:

GalGenCL.cl.c: 51: 10: ошибка: ожидается attribute = ’,‘, ’,‘; ’,‘ asm ’или‘ * ’перед« void »’ 1014 *

и это была та же ошибка, которую я получил с реальным кодом, который я хотел использовать:

__kernel void force(__global float* Galaxy, const unsigned int count)
{
    int i = get_global_id(0);
    float x,y,z,d,force;
    int j;
    for(j = 0; j < starc; j++)
    {    
        if (j == i) continue;
        //find relative distance
        x = Galaxy[i][1] - Galaxy[j][1];
        y = Galaxy[i][2] - Galaxy[j][2];
        z = Galaxy[i][3] - Galaxy[j][3];
        d = x*x+y*y+z*z;
        if (d == 0) continue;
        force = ((0.00000066742799999999995)*Galaxy[i][0]*Galaxy[j][0])/(d);
        Galaxy[i][7] = (x*x)*force*(-1)/d;
        Galaxy[i][8] = (y*y)*force*(-1)/d;
        Galaxy[i][9] = (z*z)*force*(-1)/d;
    }//end for loop
}

поэтому я попытался перейти на это:

__kernel __attribute__((vec_type_hint(float))); 
void force(__global float* Galaxy, const unsigned int count)

и получил это:

GalGenCL.cl.c: 8: 1: предупреждение: определение данных не имеет типа или хранилища класс GalGenCL.cl.c: 8: 39: ошибка: ожидаемое выражение перед "float" GalGenCL.cl.c: 8: 45: ошибка: ожидаемый токен ‘,’ или ‘;’ до ‘)’ GalGenCL.cl.c: 9: 21: ошибка: ожидается ‘)’ до «плавания»

поэтому я снова изменился, вытащив поплавок:

__kernel __attribute__((vec_type_hint())); 
void force(__global float* Galaxy, const unsigned int count)

, что сделало его немного счастливее:

GalGenCL.cl.c: 8: 1: предупреждение: определение данных не имеет типа или класса хранения GalGenCL.cl.c: 8: 1: предупреждение: директива атрибута «vec_type_hint» игнорируется GalGenCL.cl.c: 9: 21: ошибка: ожидается ‘)’ перед «плаванием»

но все равно он не примет "float" из заголовка функции, поэтому я получил точку с запятой. потом пожаловался:

GalGenCL.cl.c: 9: 1: ошибка: ожидается ‘,’ или ‘;’ перед «void»

так что теперь я просто всевозможный бестолковый. что именно он ищет?

1 Ответ

1 голос
/ 06 октября 2011

OpenCL является расширением C, и поэтому компилятор C не будет анализировать и компилировать его, если используются любые расширения.

Поэтому не имеет смысла иметь файл GalGenCL.cl.c для обработки компилятором C, если только расширения явно не учтены - возможно, через #define, чтобы скрыть или удалить их.

Казалось бы, модификатор __kernel проблематичен при компиляции.

Какая командная строка используется для компиляции вашей программы?

...