Довольно сложно понять, в чем заключается проблема, если вы говорите об аргументах ядра, у вас должен быть хотя бы один аргумент ядра, а ядра без аргументов ядра бесполезны, поскольку OpenCL обеспечивает параллелизм на основе данных, а если вы неЕсли у вас нет данных, у вас нет параллелизма, вы можете запустить ядро в одном потоке процессора ...
Если у вас проблемы с измерениями, то есть вам нужно 4 или более измерений, но OpenCL предоставляет 3, чем выдолжен сделать что-то вроде:
// Assuming that you have only a,b,c,d
// and 'amount of work' = 10 * 15 * 05 * 15
int index = get_global_id(0);
int d = index % 15; index /= 15;
int c = index % 05; index /= 05;
int b = index % 15; index /= 15;
int a = index % 10; index /= 10;
#etc (do something with a,b,c,d)
Последнее, попробуйте сделать ваши программы как можно более плоскими, OpenCL не любит много циклов и логики ветвления, попробуйте развернуть ваши циклы вручную вместо:
// if it is possible to render some constant into the OpenCL code,
// than try to expand it as much as possible
for (int i = 0; i < 4; i++) // The constant is 4
{
float x = sin(3.14 * i + ...);
float y = cos(x + ....);
x[i] = a * i * x + y ....;
}
напишите это следующим образом:
float x;
float y;
x = sin(3.14 * 0 + ...);
y = cos(x + ....);
x[0] = a * 0 * x + y ....;
x = sin(3.14 * 1 + ...);
y = cos(x + ....);
x[1] = a * 1 * x + y ....;
x = sin(3.14 * 2 + ...);
y = cos(x + ....);
x[2] = a * 2 * x + y ....;
x = sin(3.14 * 3 + ...);
y = cos(x + ....);
x[3] = a * 3 * x + y ....;
Чем лучше, тем лучше!Я говорю о разумном расширении, если у вас есть 1024 цикла в цикле, расширение их не является разумным.В этом случае вы должны расширить его на порядок 2, 4, 8 или 16 циклов, это приведет к 512, 256, 128 или 64 циклам, это может значительно повысить производительность ...