Программирование OpenCL GPU с помощью Intel HD Graphics 4000 - PullRequest
0 голосов
/ 05 сентября 2018

Я пытался реализовать простой параллельный алгоритм, используя привязки 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 ++.

1 Ответ

0 голосов
/ 07 сентября 2018

Я наконец нашел проблему. Проблема заключалась в том, что OpenCL в Mac OS X возвращает неправильный максимальный размер рабочей группы устройства 1024. Я тестировал с различными размерами рабочих групп и в результате получил 200% прироста производительности при использовании рабочей группы размером 128 рабочих элементов на группу. Вот более четкая эталонная картина. IGPU расшифровывается как Integrated GPU. (Ось X: размер массива, ось Y: длительность времени в микросекундах) enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...