Cuda 编译错误:已定义类模板

Cuda compilation error: class template has already been defined

本文关键字:定义 编译 错误 Cuda      更新时间:2023-10-16

我是 cuda 的新手,并尝试运行我在网上找到的一个简单的矢量添加示例以开始使用。我正在使用win10 64bit和Visual Studio 2017。

#include "cuda_runtime.h"
#include "cuda.h"
#include "device_launch_parameters.h"
#include <iostream>

#include <math.h>
// Kernel function to add the elements of two arrays
__global__
void add(int n, float *x, float *y)
{
int index = threadIdx.x;
int stride = blockDim.x;
for (int i = index; i < n; i += stride)
y[i] = x[i] + y[i];
}
int main(void)
{
int N = 1 << 20;
float *x, *y;
// Allocate Unified Memory – accessible from CPU or GPU
cudaMallocManaged(&x, N * sizeof(float));
cudaMallocManaged(&y, N * sizeof(float));
// initialize x and y arrays on the host
for (int i = 0; i < N; i++) {
x[i] = 1.0f;
y[i] = 2.0f;
}
// Run kernel on 1M elements on the GPU
add <<<1, 1 >>>(N, x, y);
// Wait for GPU to finish before accessing on host
cudaDeviceSynchronize();
// Check for errors (all values should be 3.0f)
float maxError = 0.0f;
for (int i = 0; i < N; i++)
maxError = fmax(maxError, fabs(y[i] - 3.0f));
std::cout << "Max error: " << maxError << std::endl;
// Free memory
cudaFree(x);
cudaFree(y);
return 0;
}

我使用了"VS2017的开发人员命令提示符",因为窗口的命令提示符给了我

nvcc fatal : Cannot find compiler 'cl.exe' in PATH

在线解决方案对我不起作用。然后我运行了这个命令(--编译器-选项已经解决了一些错误(

nvcc add.cu --compiler-options "-D _WIN64"

但是编译器仍然给我错误

C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(95): error: class template "std::_Is_function" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(139): error: class template "std::_Is_memfunptr" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(1824): error: class template "std::result_of" has already been defined
C:ProgrammingMicrosoft Visual Studio2017CommunityVCToolsMSVC14.14.26428includetype_traits(1824): error: class template "std::result_of" has already been defined

我一直在寻找解决方案。似乎其他有类似问题的人在他们包含的标头方面遇到了问题,但我的示例代码是从互联网上下载的,上传它的人没有任何问题,这让我对程序的哪个部分有问题感到困惑。

PS:我不知道我的cuda是否正确安装。详: 我无法在我的窗户上安装 cuda,安装一直告诉我安装失败。然后我在帖子 #19 的这个链接中找到了一个解决方案:https://devtalk.nvidia.com/default/topic/1035535/cuda-setup-and-installation/cuda-9-2-does-not-work-with-visual-studio-2017-15-7-1/2 它似乎工作正常,但我不知道这是否是问题所在。

我在Visual Studio 2019和CUDA v10.1中遇到了同样的问题,但是重新安装没有区别。最初我安装了不支持的Visual Studio 2012,所以我更新了版本,然后我开始看到模板类重定义错误,如此处所述 - 我使用的解决方案是将c1.exe/c1.dll的环境变量从(x86(更改为(x64(目录,我的所有错误都消失了。

是: D:\Program Files (x86(\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x86

现在: D:\Program Files (x86(\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x64

我在Nvidia CUDA论坛上发布了相同的帖子: 链接在这里

我使用帖子中的方法重新安装了多次,但仍然遇到相同的"类模板"问题。

然后我也使用相同的方法重新安装了 CUDA 9.1 和 VS2017 版本 15.6.7,它终于可以工作了。

我遇到的其他问题也在帖子中。