opencl中的优先级队列

时间:2012-11-30 07:14:29

标签: opencl a-star

我正在尝试在OpenCL上实现A-Star搜索算法,但无法找到为其实现优先级队列的方法。以下是我在.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 个答案:

答案 0 :(得分:0)

以下是各种无锁GPU数据结构(包括跳过列表和优先级队列)的文章,pptx和源的链接。但是源代码是CUDA。 CUDA代码足够接近OpenCL,您可以了解如何在OpenCL中实现此功能。

使用原子操作同步优先级队列。队列节点在主机上分配,并作为全局节点数组传递给函数。通过使用数组计数器的原子增量获得新节点。

使用原子比较和交换(交换)调用将节点插入队列。论文和ppx 解释工作和并发问题。

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

请参阅上页中的条目

并行编程/运行时支持 [ICPADS 2012] [PDF] [源代码] [谈话幻灯片(PPTX)] Prabhakar Misra和Mainak Chaudhuri。 GPU上并发无锁数据结构的性能评估。在第18届IEEE并行和分布式系统国际会议论文集,第53-60页,2012年12月。

源代码链接为http://www.cse.iitk.ac.in/users/mainakc/lockfree.html

答案 1 :(得分:0)

如果不支持原子操作,还有另一种方法。 您可以使用这个想法来平行Harish和Narayanan的论文Accelerating large graph algorithms on the GPU using CUDA中的Dijkstra最短路径算法。

他们建议复制数组以实现与Mask,Cost和Update数组的同步。

Mask是一个唯一的布尔数组,用于表示具有此大小的队列。如果此数组中的元素 i 为true,则 i 元素位于队列中。

有两个内核可以保证同步:

  • 第一个内核仅从Cost数组中读取值 写入更新数组。
  • 第二个内核只更新Cost 如果它们与Update不同,则为值。在这种情况下,升级后的元素 将被设置为真。

这个想法很有效,在OpenCL编程指南的书中有一个案例研究的实现:https://code.google.com/p/opencl-book-samples/source/browse/trunk/src/Chapter_16#Chapter_16%2FDijkstra