Я пытался реализовать простой параллельный алгоритм, используя привязки OpenCL c ++ (версия 1.2).
Примерно вот код c (без OpenCL):
typedef struct coord{
double _x;
double _y;
double _z;
}__coord;
typedef struct node{
__coord _coord;
double _dist;
} __node;
double input[3] = {-1.0, -2, 3.5};
//nodeVector1D is a 1Dim random array of struct __node
//nodeVectorSize is the Size of the above array (>1,000)
double d = 0.0;
for(int i=0; i < nodeVectorSize; i++){
__node n = nodeVector1D[i];
d += (input[0] - n._coord._x)*(input[0] - n._coord._x);
d += (input[1] - n._coord._y)*(input[1] - n._coord._y);
d += (input[2] - n._coord._z)*(input[2] - n._coord._z);
n._dist = d;
}
Я использую MacBook Pro 13 "конца 2013 года, работающий на Mac Os X Lion.
OpenCL обнаруживает только процессор.
Процессор: Intel Ivy i5 2,6 ГГц, имеет встроенный графический процессор 1 ГБ с частотой 1,6 ГГц (Intel HD Graphics 4000).
Максимальный обнаруженный размер элемента группы составляет 1024 байта.
Когда я запускаю простой код выше (с 1024 узлами), это занимает около 17 микросекунд. +
Когда я запускаю его параллельную версию с использованием библиотеки OpenCL, C ++, это занимает в 10 раз больше времени, около 87 микросекунд.
(исключая создание программы, выделение буфера и запись).
Что я тут не так делаю?
NB. Ядро OpenCL для этого алгоритма очевидно, но я могу опубликовать его при необходимости.
Заранее спасибо.
РЕДАКТИРОВАТЬ N # 1: КОД ЯДРА
__kernel void _computeDist(
__global void* nodeVector1D,
const unsigned int nodeVectorSize,
const unsigned int itemsize,
__global const double* input){
double d = 0.;
int i,c;
double* n;
i = get_global_id(0);
if (i >= nodeVectorSize) return;
n = (double*)(nodeVector1D + i*itemsize);
for (c=0; c<3;c++){
d += (input[c] - n[c])*(input[c] - n[c]);
}
n[3] = d;
}
Извините за арифметику пустого указателя, но она работает (без сегмента по умолчанию).
Я также могу опубликовать процедуру инициализации OpenCL, но я думаю, что это происходит через Интернет. Тем не менее, я опубликую его, если кто-то спросит.
@ pmdj: Как я уже говорил выше, OpenCL распознает мой процессор, иначе я бы не смог запустить тесты и получить результаты производительности, представленные выше.
@ pmdj: Код ядра OpenCL, насколько мне известно, всегда пишется на C. Однако я пометил C ++, потому что (как я уже говорил выше) я использую привязки OpenCL C ++.