我正在编写CUDA / C ++代码,该代码以多种方式使用一堆push :: device_vectors。我的算法最近的发展变化迫使我使用带有--arch = sm_60标志的NVCC进行编译。此更改导致弹出一些有关从设备函数调用主机函数的编译器警告标志。但是警告不会导致任何错误,我认为它们在那里,因为我滥用了一些#ifndef host device 指令。我的主要问题是我的群集GPU上不再有推力:: device_vector <> ::: functions。
我得到的特定示例与push :: device_vector <> :: resize()调用有关。调用此函数时,代码将弹出: 抛出'thrust :: system :: system_error'实例后调用终止 what():parallel_for失败:cudaErrorNoKernelImageForDevice:没有内核映像可用于在设备上执行
,然后发生核心转储。会弹出该错误的多个版本,至少对于我来说,这些版本都提供的信息不足。仍然很陌生,该可执行文件在我的本地计算机上工作正常,但在我的工作集群系统上不起作用。该系统使用rhel7 OS,我使用的是gcc 4.8.5和nvcc CUDA-10.1.105。
下面是重现此错误的最小示例。
#include <thrust/device_vector.h>
#include <stdio.h>
int main()
{
thrust::device_vector<double> xd;
xd.resize(10);
std::cout << xd.size() << "\n";
return(0);
}
我用以下命令编译它: nvcc -arch = sm_60 file_name.cu
它总是在xd.resize(10)崩溃。但是,如果我用它编译: nvcc file_name.cu
没有崩溃。 在我的本地计算机上,这两种方法都像一种魅力。
请帮助?