opencl中的优先级队列

opencl中的优先级队列,opencl,a-star,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

我正在尝试在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);
 }
}
//如何实现这些??
void extractFromPriorityQueue();
void insertIntoPriorityQueue();
//如何实施这些??
__内核void startAStar(//必要的输入){
int id=获取全局id(0);
int currentNode=extractFromPriorityQueue(priorityQueueArray,id);
如果(currentNode==0){
返回;
}
int最早的_边=顶点阵列[currentNode-1];
int next_vertex_edge=vertexArray[currentNode];

对于(int i=earlime_edge;i,下面是各种无锁GPU数据结构(包括跳过列表和优先级队列)的纸张、pptx和源的链接。但是源代码是CUDA。CUDA代码与OpenCL非常接近,您可以从中获得如何在OpenCL中实现这一点的要点

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

使用原子比较和交换(exchange)调用将节点插入队列 解释工作原理和并发性问题

请参阅上一页中的条目

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


源代码链接是

如果不支持原子操作,还有另一种方法。 您可以使用这个想法并行化Harish和Narayanan论文中的Dijkstra最短路径算法

他们建议复制阵列进行同步,并考虑屏蔽、成本和更新阵列

掩码是表示此大小队列的唯一布尔数组。如果此数组中的元素i为true,则该元素i位于队列中

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

  • 第一个内核只从Cost数组中读取值,并且只从 在更新数组中写入
  • 第二个内核只更新成本 值,如果它们与Update不同。在这种情况下,升级的元素 将被设置为真
这个想法很有效,在OpenCL编程指南的书中有一个案例研究的实现: