Производительность OpenCL

184
11 августа 2018, 12:30

Возникла проблема оптимизации алгоритма поиска пути на карте (двухмерный массив), уперся в производительность, которая после 200 элементов была уже сносная.

В итоге решил все это дело (сам алгоритм поиска пути - волновой) переписать на OpenCL и запустить. Каково же было мое удивление, что оно беспощадно тормозит (причем не сам алгоритм, а что-то связанное с OpenCL, так как первый активно тестировался на обычном СPU). Может быть я что-то делаю не так?

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

Алгоритм за основу был взят из викиучебника. Буду благодарен помощи, или объяснению, что я сделал не так, спасибо!

kernel void PathFind(global int* grid, global int* pxx, global int* pyy, int ax, int ay, int bx, int by, int sizeY, int sizeX)
{
    const int WALL   =  2147483647;        
    const int BLANK  = -1;         

    int len;                       
      int dx[4] = {1, 0, -1, 0};   
      int dy[4] = {0, 1, 0, -1};   
      int d, x, y, k;
      bool stop;
      d = 0;
      grid[ax + ay * sizeX] = 0;            
      do {
        stop = true;              
        for ( y = 0; y < sizeY; ++y )
          for ( x = 0; x < sizeX; ++x )
            if ( grid[x + y * sizeX] == d )                        
            {
              for ( k = 0; k < 4; ++k )                    
              {
                 int iy=y + dy[k], ix = x + dx[k];
                 if ( iy >= 0 && iy < sizeY && ix >= 0 && ix < sizeX &&
                      grid[ix + iy * sizeX] == BLANK )
                 {
                    stop = false;              
                    grid[ix + iy * sizeX] = d + 1;    
                 }
              }
            }
        d++;
      } while ( !stop && grid[bx + by * sizeX] == BLANK );
      len = grid[bx + by * sizeX];            
      x = bx;
      y = by;
      d = len;
      while ( d > 0 )
      {
        pxx[d] = x*10;
        pyy[d] = y*10;                  
        d--;
        for (k = 0; k < 4; ++k)
        {
           int iy = y + dy[k]; 
           int ix = x + dx[k];
           if ( iy >= 0 && iy < sizeY && ix >= 0 && ix < sizeX && grid[ix + iy * sizeX] == d)
          {
              x = x + dx[k];
              y = y + dy[k];          
              break;
          }
        }
      }
      pxx[0] = ax*10;
      pyy[0] = ay*10;
}
READ ALSO
Блокировка с задержкой

Блокировка с задержкой

День добрый, требуется заблокировать textbox`s на минуту, а потом снять блокировку, и если были введены неверные значения более двух разЕсли в третий...

214
На сервере не работает $_POST

На сервере не работает $_POST

Работаю с Retrofit2, Volley даже уже Postman тестилНе работает $_POST на сервере

219
Добавление пользователя к facebook webhook

Добавление пользователя к facebook webhook

Есть следующий код и при его выполнении выбивает ошибку,расположенную нижеВ чем может быть причина?

204
Подсчитать сумму полей внутри дерева

Подсчитать сумму полей внутри дерева

Есть таблица с полями id(int), name(text), parent(int) и value(int), как подсчитать сумму value свою и всех детей? Через mysql или вывести дерево вложенных массивов...

165