带推力减少的推力::复杂无法编译

Posted

技术标签:

【中文标题】带推力减少的推力::复杂无法编译【英文标题】:thrust::complex with thrust reduce does not compile 【发布时间】:2019-01-28 12:21:30 【问题描述】:

我一直在尝试实现一些需要在推力::complexes 上调用 reduce 的代码,编译器向我发出错误提示:

无法将带有用户提供的复制构造函数的参数传递给设备端内核启动

代码如下:

#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/complex.h>
#include <thrust/transform.h>
#include <vector>

using namespace thrust;

void exec() 
    auto v = std::vector<complex<double>>(1.0,1.0,1.0,1.0);
    auto complexZero = complex<double>();
    device_vector<complex<double>> devA(v);
    thrust::reduce(devA.begin(), devA.end(), complexZero, plus<complex<double>>());    

int main() 
    exec();

[CUDA 9.2 与 g++]

我做错了吗?

【问题讨论】:

您使用的是哪个版本的 CUDA?还有什么主机编译器? 我正在使用 cuda 9.2 并使用 nvcc test.cu -std=c++14 -arch=sm_61 --device-c 行编译它 对于主机编译器,我不确定我是否理解您的问题,我在此示例中使用的唯一编译器是 nvcc nvcc 不是编译器。它使用主机编译器(gcc、clang 或可视 C++ 编译器)来完成大部分工作。你用的是哪一个? 哦,好吧! (我仍然是 cuda 的极端初学者)。我查了一下,宿主编译器是gcc 这似乎是 CUDA 9.2 版本的推力的缺陷。您的代码在 CUDA 9.1、gcc 4.8.5、RHEL 7.x 上为我编译干净,在编译命令行中用 -std=c++11 替换 -std=c++14。我已向 NVIDIA 提交了内部缺陷。欢迎您在 developer.nvidia.com 上提交推力问题或报告错误。目前我没有任何进一步的信息。好的,您似乎已经提交了一个推力问题。 【参考方案1】:

这似乎是 CUDA 9.2 中提供的推力版本的某种回归。您发布的代码可以在 CUDA 9.1 及更早版本中正确编译。

NVIDIA 和推力开发人员似乎都提出了这个问题。

[此帖子从 cmets 添加为社区 wiki 条目,以获取未回答队列的问题。随着有关解决方案的更多信息可用,请随时对其进行编辑]

【讨论】:

确实是回归。 github问题链接:github.com/thrust/thrust/issues/928【参考方案2】:

从 CUDA 10.0 开始,此问题已得到修复。

来源:我是 Thrust 维护者。

【讨论】:

以上是关于带推力减少的推力::复杂无法编译的主要内容,如果未能解决你的问题,请参考以下文章

如何减少推力的元组(也返回一个元组)?

使用带步幅的推力计数迭代器

错误:推力程序中未定义标识符“atomicOr”

您如何构建示例 CUDA 推力设备排序?

微软首席研究员刘铁岩:深度学习的推力与阻碍

不允许通过从__host__ __device__函数调用__host__函数来编译推力集差异