【发布时间】:2022-02-19 01:12:54
【问题描述】:
我正在编写我的第一个 CUDA 程序并遇到很多问题,因为我的主要编程语言不是 C++。
在我的控制台应用程序中,我有一个 vector 或 int,其中包含一个恒定的数字列表。我的代码应该创建新向量并检查与原始常量向量的匹配。
我不知道如何将向量的指针传递/复制到 GPU 设备中。在我尝试将我的代码从 C# 转换为 C++ 并使用内核后,我收到此错误消息:
"从 global 函数调用 host 函数时出错("std::vector
这是我的代码的一部分:
std::vector<int> selectedList;
FillA1(A1, "0152793281263155465283127699107744880041");
selectedList = A1;
bigCUDAJob<< <640, 640, 640>> >(i, j, selectedList);
__global__ void bigCUDAJob(int i, int j, std::vector<int> selectedList)
{
std::vector<int> tempList;
// here comes code that adds numbers to tempList
// code to find matches between tempList and the
// parameter selectedList
}
如何修改我的代码以免出现编译器错误?我也可以使用 int 数组。
【问题讨论】:
-
您既不能在 GPU 上使用
std::vector,也不能只使用正常分配的内存。如果您想使用 C++ 容器,请查看 Thrust 库。他们提供device_vector和universal_vector(和host_vector,但那个不太重要)。即使这样,您也不想将整个向量传递给内核,而只是将原始 CUDA 指针传递给内核(即thrust::raw_pointer_cast(my_vector.data()))。一个更优雅的解决方案是将原始指针包装在来自gsl-lite 的span实现中,这可用于设备代码(内核)。 -
对于
tempList,即使是推力也不是解决方案(参见here)。推力向量为您提供设备内存,但其成员函数仍然只能在主机上使用。