Вопрос: Чего не хватает в объявлении этой функции / ядра, которое мешает его компиляции?
Информация:
__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»
так что теперь я просто всевозможный бестолковый. что именно он ищет?