我正在尝试使用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数组,在该数组中标记了已访问的节点。如何将该数组传递给谓词,以使其可在设备执行的代码中使用?

最佳答案

可能有多种方法可以解决此问题。我将介绍一种方法。请注意,您的问题是如何将任意数据集传递给函子,这就是我要显示的内容。我并不是要解决您的拟函子是否是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
    }
};

关于c++ - 如何将其他数组传递给Thrust的min_element谓词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23942329/

10-11 22:42
查看更多