Cuda compilation error: class template has already been defined

Cuda compilation error: class template has already been defined

我是 cuda 的新手,并尝试 运行 我在网上找到的一个简单的矢量添加示例来开始。我正在使用 win10 64 位和 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;
}

我使用了 "Developer Command Prompt for VS2017",因为 window 的命令提示符给了我

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

在线解决方案对我不起作用。然后我 运行 这个命令(--compiler -options 已经解决了一些错误)

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

但编译器仍然给我错误

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(95): error: class template "std::_Is_function" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(139): error: class template "std::_Is_memfunptr" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(1824): error: class template "std::result_of" has already been defined

C:\Programming\Microsoft Visual Studio17\Community\VC\Tools\MSVC.14.26428\include\type_traits(1824): error: class template "std::result_of" has already been defined

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

P.S.: 不知道我的cuda有没有安装好。细节: 我无法在 windows 上安装 cuda,安装程序一直告诉我安装失败。然后我在 post #19 的 link 中找到了解决方案: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 好像没问题,不知道是不是问题

我在 Nvidia CUDA 论坛中 post 编辑了相同的 post: Link Here

我使用 post 中的方法重新安装了多次,但仍然遇到相同的 "class template" 问题。

然后我用同样的方法重装了CUDA 9.1和VS2017 ver 15.6.7,终于可以了。

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

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

是: D:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.22.27905\bin\Hostx64\x86

现在: D:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.22.27905\bin\Hostx64\x64