opencl中的优先级队列
我正在尝试在OpenCL上实现A-Star搜索算法,但无法找到一种方法来实现它的优先级队列。下面是我试图在.cl文件中执行的操作的大致思路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
//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编程指南的书中有一个案例研究的实现: