OpenCL выполняется без входных данных или используя 3 измерения - PullRequest
0 голосов
/ 16 июля 2011

Здравствуйте, у меня есть алгоритм, схожий по моде с этим (в Python):

for a in xrange(10):
    for b in xrange(15):
        for c in xrange(5):
            for d in xrange(15):
                #etc

Код проходит через множество комбинаций линейных параметров.Могу ли я и должен ли я выполнить ядро ​​без входных данных и только с идентификатором, где можно вычислить числовые параметры, или я должен отправить 3 измерения целочисленных данных для первых 3 параметров, а затем вычислить остальные параметры в каждой из работitems.

Я не знаю, каким образом я могу запускать команды без входных данных и просто иметь инкрементный идентификатор для всех рабочих элементов, чтобы я мог рассчитать параметры для всех комбинаций.Это возможно?Рекомендуется ли это?

Спасибо за любую помощь.

Примечание. Использование библиотек C для OpenCL.

1 Ответ

1 голос
/ 18 июля 2011

Довольно сложно понять, в чем заключается проблема, если вы говорите об аргументах ядра, у вас должен быть хотя бы один аргумент ядра, а ядра без аргументов ядра бесполезны, поскольку 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 циклам, это может значительно повысить производительность ...

...