Приоритетная очередь в opencl

Я пытаюсь реализовать алгоритм поиска A-Star в OpenCL и не могу найти способ реализовать приоритетную очередь для него. Вот общее представление о том, что я пытаюсь сделать в моем файле.cl

//HOW TO IMPLEMENT THESE??
void extractFromPriorityQueue();
void insertIntoPriorityQueue();
//HOW TO IMPLEMENT THESE??

__kernel void startAStar(//necessary inputs) {
 int id = get_global_id(0);
 int currentNode = extractFromPriorityQueue(priorityQueueArray,id);
  if(currentNode==0){
    return;
  }
 int earliest_edge = vertexArray[currentNode-1];
 int next_vertex_edge = vertexArray[currentNode];
 for(int i=earliest_edge;i<next_vertex_edge;i++){
    int child = edgeArray[i];
    float weight = weightArray[i];
    gCostArray[child-1] = gCostArray[currentNode] + weight;
    hCostArray[child-1] = computeHeuristic(currentNode,child,coordinateArray);
    fCostArray[child-1] = gCostArray[child-1] + hCostArray[child-1];
    insertIntoPriorityQueue(priorityQueueArray,child);
 }
}

Кроме того, нужно ли синхронизировать очередь с приоритетами в этом случае?

2 ответа

Есть другой способ, если атомарные операции не поддерживаются. Вы можете использовать эту идею для распараллеливания алгоритма кратчайшего пути Дейкстры из статьи Хариша и Нарайанана. Ускорение алгоритмов с большими графами на графическом процессоре с использованием CUDA.

Они предлагают продублировать массивы для синхронизации с идеями массивов Mask, Cost и Update.

Маска - это уникальный логический массив, представляющий очередь с таким размером. Если элемент i в этом массиве равен true, элемент i находится в очереди.

Есть два ядра, которые гарантируют синхронизацию:

  • Первое ядро ​​читает только значения из массивов Cost и записывает только в массивы Update.
  • Второе ядро ​​обновляет только значения Cost, если они отличаются от Update. В этом случае обновленный элемент будет установлен в значение true.

Идея работает, и в книге "Руководство по программированию OpenCL" реализована реализация кейса: https://code.google.com/p/opencl-book-samples/source/browse/trunk/src/Chapter_16.

Ниже приведены ссылки на документ, pptx и исходные тексты для различных структур данных GPU без блокировки, включая список пропусков и приоритетную очередь. Однако исходный код CUDA. Код CUDA достаточно близок к OpenCL, чтобы вы могли понять суть того, как реализовать это в OpenCL.

Очередь приоритетов синхронизируется с помощью атомарных операций. Узлы очереди размещаются на хосте и передаются в функции как глобальный массив узлов. Новый узел получается с помощью атомарного приращения счетчика массива.

Узлы вставляются в очередь с помощью атомарных вызовов сравнения и обмена. Бумага и ppx объясняют работу и проблемы параллелизма.

http://www.cse.iitk.ac.in/users/mainakc/projects.html

Смотрите запись на странице выше

Параллельное программирование / Поддержка времени выполнения [ICPADS 2012][PDF][Исходный код] [Разговорные слайды (PPTX)] Прабхакар Мисра и Майнак Чаудхури. Оценка производительности параллельных структур данных без блокировок на графических процессорах. В материалах 18-й Международной конференции IEEE по параллельным и распределенным системам, стр. 53-60, декабрь 2012 г.

Ссылка на исходный код: http://www.cse.iitk.ac.in/users/mainakc/lockfree.html

Другие вопросы по тегам