c++ - 如何将附加数组传递给 Thrust 的 min_element 谓词

标签 c++ cuda thrust

我正在尝试使用 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/

相关文章:

c++ - CUDA的 'thrust::min_element'函数的时间复杂度是多少?

c++ - 如何向 XCode 5 添加替代编译器

c++ - 使用自由函数作为伪构造函数来利用模板参数推导

c++ - 从 Visual Studio 启动另一个项目

c++ - 在 ubuntu 中将 c++ 编译器、链接器标志添加到 nsight eclipse 6.5

XCode 和 CUDA 集成

c++ - 数组指针,(*ptr)[] 和 *ptr[] 有什么区别

c++ - 在C++中调用QQuickItem(TextArea)的方法

random - 在GPU上高效获取范围内的随机数

c++ - 如何使用 CUDA/Thrust 根据其中一个数组中的值对两个数组/vector 进行排序