我正在尝试制作一个示例代码,从
std::deque
复制到thrust::device_vector
,但编译器警告calling a __host__ function from a __host__ __device__ function is not allowed
(我尝试在此处复制粘贴整个错误,但它超出了字符限制问题)。如果需要,我可以发布更多详细信息。
代码编译成功,但我真的对这些错误感到恼火,因为它们不会发生在其他 stl 容器中,如
std::list
和 std::vector
。
我想知道为什么会发生这些问题以及如何解决这些警告。
这是
nvcc --version
结果:
nvcc:NVIDIA (R) Cuda 编译器驱动程序 版权所有 (c) 2005-2016 NVIDIA 公司 建于 Tue_Jan_10_13:22:03_CST_2017 Cuda编译工具,版本8.0,V8.0.61
这是我的示例代码
#include <iostream>
#include <algorithm>
#include <deque>
#include <thrust/device_vector.h>
const uint size = 100;
__global__
void hello (int *a) {
a[threadIdx.x] += threadIdx.x;
}
int main (int argc, const char **argv) {
std::deque<int> a(size);
std::fill(a.begin(), a.end(), 1);
thrust::device_vector<int> a_cuda(a.begin(), a.end());
dim3 dimBlock(size, 1);
dim3 dimGrid(1, 1);
hello<<< dimGrid, dimBlock >>>(thrust::raw_pointer_cast(&a_cuda[0]));
thrust::copy(a_cuda.begin(), a_cuda.end(), a.begin());
for (const int i : a) {
std::cout << i << ' ';
}
std::cout << std::endl;
return EXIT_SUCCESS;
}
这是我用来编译的命令:
nvcc 文件.cu -std=c++11 -O3 -o 你好
提前致谢
七年后,当前的工具链 (12.4) 仍然报告相同的警告。 Thrust 现在作为一个单独的项目已经结束,并已集成到一个名为 CCCL 的新 CUDA C++ 库中。
正如我在 2017 年所写:
很明显推力副本里有东西坏了 构造函数在可能不应该发出代码时发出代码(它也 用
复制结构和thrust::host_vector
来实现 作为来源)std::deque
我在 Thrust Github 跟踪器上没有看到任何证据表明这是一个错误,而且显然这个问题从未得到修复。
您可以通过将
-diag-suppress 20014 -diag-suppress 20011
作为选项传递给 nvcc 来抑制这些特定警告。
作为最后的评论,我不认为
std::deque
实际上能够保证它用于存储的内存是连续的,这与 std::vector
不同。这意味着使用 deque
作为源内存来构造 device_vector
在技术上是无效的,因为推力将使用主机设备对 begin()
指向的内存进行 memcpy 调用来复制而不是连续调用迭代器begin()
到 end()
遍历内存。它可能在微不足道的情况下起作用,但这样做是未定义的行为。
[根据评论汇总答案,并将其添加为社区 wiki 条目,以将问题从 CUDA 标签的未解答列表中删除]