Возникла проблема оптимизации алгоритма поиска пути на карте (двухмерный массив), уперся в производительность, которая после 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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
День добрый, требуется заблокировать textbox`s на минуту, а потом снять блокировку, и если были введены неверные значения более двух разЕсли в третий...
Работаю с Retrofit2, Volley даже уже Postman тестилНе работает $_POST на сервере
Есть следующий код и при его выполнении выбивает ошибку,расположенную нижеВ чем может быть причина?
Есть таблица с полями id(int), name(text), parent(int) и value(int), как подсчитать сумму value свою и всех детей? Через mysql или вывести дерево вложенных массивов...