1

Когда у нас есть программа, которая требует большого количества операций над большими наборами данных, и операции над каждым из элементов данных независимы, OpenCL может быть одним из лучших вариантов сделать это быстрее. У меня есть программа, как следующее:Какова наилучшая общая вычислительная практика OpenCL для итерационных задач?

while(function(b,c)!=TRUE) 
{ 
    [X,Y] = function1(BigData); 
    M = functionA(X); 
    b = function2(M); 
    N = functionB(Y); 
    c = function3(N); 
} 

Здесь function1 применяется на каждом из элементов на BigData и производить еще два больших наборов данных (X, Y). function2 и function3 затем применяются индивидуально для каждого из элементов этих данных X, Y соответственно.

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

while(function(b,c)!=TRUE) 
{ 
    //[X,Y] = function1(BigData); 
    1. load kernel1 and BigData on the GPU. each of the thread will work on one of the data 
element and save the result on X and Y on GPU. 

    //M = functionA(X); 
    2a. load kernel2 on GPU. Each of the threads will work on one of the 
data elements of X and save the result on M on GPU. 
(workItems=n1, workgroup size=y1) 

    //b = function2(M); 
    2b. load kernel2 (Same kernel) on GPU. Each of the threads will work on 
one of the data elements of M and save the result on B on GPU 
(workItems=n2, workgroup size=y2) 
    3. read the data B on host variable b 

    //N = functionB(Y); 
    4a. load kernel3 on GPU. Each of the threads will work on one of the 
data element of Y and save the result on N on GPU. 
(workItems=n1, workgroup size=y1) 

    //c = function2(M); 
    4b. load kernel3 (Same kernel) on GPU. Each of the threads will work 
on one of the data element of M and save the result on C on GPU 
(workItems=n2, workgroup size=y2) 
    5. read the data C on host variable c 
} 

Однако накладные расходы, связанные с этим кодом кажется важным для меня (я реализовал тестовую программу и запустить на GPU). И если в ядрах есть какая-то синхронизация, это может закончиться большим замедлением.

Я также считаю, что рабочий процесс является обычным явлением. Итак, что лучше всего использовать OpenCL для ускорения для такой программы.

+0

карты могут читать + писать + вычислять одновременно, поэтому вы должны сделать их параллельными, когда это возможно. –

+0

Спасибо за информацию. Но, как вы видите, все операции в цикле зависят от результата предыдущей операции. Итак, рассмотрим параллелизм, как вы предлагаете, невозможно. Есть ли другой способ улучшить его. В противном случае, какова наилучшая практика. –

+0

В opencl 2.0 есть боковое ядро ​​устройства, поэтому оно может быть быстрее, а не ждать хоста для каждого ядра init. –

ответ

0

Я не думаю, что существует общая проблема с тем, как вы разделили проблему на ядра, хотя трудно сказать, поскольку вы не были очень конкретными. Как часто вы ожидаете, что цикл while будет запущен?

Если ваши ядра выполняют незначительную работу, но внешний цикл выполняет много итераций, вы можете объединить ядра в один и выполнить некоторое количество итераций внутри самого ядра, если это работает для вашей проблемы.

В противном случае:

Если вы получаете неожиданно плохую производительность, вы, скорее всего, нужно искать в эффективности каждый из ваших ядер, и, возможно, их модель доступа к данным. Если соседние рабочие элементы не читают/не записывают соседние данные (в идеале: 16 рабочих элементов считывают по 4 байта из 64-байтной строки кэша за раз), вы, вероятно, теряете пропускную способность памяти. Если ваши ядра содержат множество условных выражений или инертных констант цикла, то это будет стоить вам и т. Д.

Вы не указываете, какие типы времени работы вы получаете, о том, какой размер вакансии (десятки тысяч) ? Миллионы арифметических операций? Насколько велики ваши наборы данных?) Или какое оборудование. (Вычислительная карта? Ноутбук IGPU?) «Значительные накладные расходы» могут означать много разных вещей. 5ms? 1 секунда?

Intel, nVidia и AMD все публикуют руководства по оптимизации - вы их прочитали?