Когда у нас есть программа, которая требует большого количества операций над большими наборами данных, и операции над каждым из элементов данных независимы, 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 для ускорения для такой программы.
карты могут читать + писать + вычислять одновременно, поэтому вы должны сделать их параллельными, когда это возможно. –
Спасибо за информацию. Но, как вы видите, все операции в цикле зависят от результата предыдущей операции. Итак, рассмотрим параллелизм, как вы предлагаете, невозможно. Есть ли другой способ улучшить его. В противном случае, какова наилучшая практика. –
В opencl 2.0 есть боковое ядро устройства, поэтому оно может быть быстрее, а не ждать хоста для каждого ядра init. –