我尝试使用Thrust的min_element
缩减来寻找Prim算法的下一个边缘。我迭代图边。这是我的比较功能:
struct compareEdge {
__host__ /*__device__*/ bool operator()(Edge l, Edge r) {
if (visited[l.u] != visited[l.v] && visited[r.u] != visited[r.v]) {
return l.cost < r.cost;
} else if (visited[l.u] != visited[l.v]) {
return true;
} else {
return false;
}
}
};
不幸的是,此代码无法在设备上运行,因为我使用visited
数组,其中我标记了已访问过的节点。如何将此数组传递给我的谓词以使其可以从设备执行的代码中使用?
答案 0 :(得分:3)
可能有很多方法可以解决这个问题。我将介绍一种方法。请注意,您的问题是如何将任意数据集传递给仿函数,这正是我想要展示的。我不是要解决你提出的仿函数是否是thrust::min_element(我不确定)的有用比较谓词的问题。
一种方法就是拥有一个静态定义的数组:
__device__ int d_visited[DSIZE];
然后在您的主机代码中,在使用仿函数之前,您需要初始化数组:
cudaMemcpyToSymbol(d_visited, visited, DSIZE*sizeof(int));
您的仿函数代码必须进行修改。由于您可能希望仿函数可以在主机或设备上使用,我们需要根据这个来控制代码:
struct compareEdge {
__host__ __device__ bool operator()(Edge l, Edge r) {
#ifdef __CUDA_ARCH__
if (d_visited[l.u] != d_visited[l.v] && d_visited[r.u] != d_visited[r.v]) {
return l.cost < r.cost;
} else if (d_visited[l.u] != d_visited[l.v]) {
return true;
} else {
return false;
}
#else
if (visited[l.u] != visited[l.v] && visited[r.u] != visited[r.v]) {
return l.cost < r.cost;
} else if (visited[l.u] != visited[l.v]) {
return true;
} else {
return false;
}
#endif
}
};