从 std::deque 复制到推力 device_vector

问题描述 投票:0回答:1

我正在尝试制作一个示例代码,从

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 你好

提前致谢

c++ c++11 cuda thrust stddeque
1个回答
0
投票

七年后,当前的工具链 (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 标签的未解答列表中删除]

© www.soinside.com 2019 - 2024. All rights reserved.