Search code examples
cudavisual-studio-2022nvcc

How to Compile correctly with nvcc in Visual Studio?


Problem Descriptions

weird things appeared again when i use Visual Studio for CUDA programming (really hate VS qwq).

I remembered compiling and running fine previously, but this time it failed even with an extremely simple program. From the error info I guess it may involve the compiling environment but I have no idea how to fix it.

Thanks for help

using VS2022; CUDA toolkit 11.7

Situation Display

the program aimed to compile

#include <iostream>
#include <math.h> 

// function to add the elements of two arrays
__global__
void add(int n, float *x, float *y)
{
    int index = blockIdx.x * blockDim.x + threadIdx.x;
    int stride = gridDim.x * blockDim.x; // total thread num
    for (int i = index; i < n; i += stride) 
        y[i] = x[i] + y[i];
} 

int main(void)
{ 
    int N = 1 << 20; // 1M elements 
    float *x; 
    float *y; 

    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 CPU 
    int blockSize = 256;  // thread per block
    int numBlocks = (N + blockSize - 1) // blockSize;
    add<<<numBlocks, blockSize>>>(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;
}

when i try to compile it in Visual Studio, error occurred and the info is as follows:

Code Description
MSB372 The command ""D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\bin\nvcc.exe" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --use-local-env -ccbin "D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\bin\HostX64\x64" -x cu -I"D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include" -I"D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include" -G --keep-dir x64\Debug -maxrregcount=0 --machine 64 --compile -cudart static -g -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Fdx64\Debug\vc143.pdb /FS /Zi /RTC1 /MDd " -o D:\0_Personal_File\CUDA\cuda_by_example\cuda_by_example\cuda-demo\cuda-demo\x64\Debug\add.cu.obj "D:\0_Personal_File\CUDA\cuda_by_example\cuda_by_example\cuda-demo\cuda-demo\add.cu"" exited with code 1.

so i try to use commandline for compiling (thinking it may be clearer):

D:\0_Personal_File\CUDA\cuda_by_example\cuda_by_example\cuda-demo\cuda-demo>nvcc add.cu -o add.exe

and the error info display:

add.cu
D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\vcruntime.h(197): error: invalid redeclaration of type name "size_t"

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\vcruntime_new.h(48): error: first parameter of allocation function must be of type "size_t"

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\vcruntime_new.h(53): error: first parameter of allocation function must be of type "size_t"

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\vcruntime_new.h(59): error: first parameter of allocation function must be of type "size_t"

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\vcruntime_new.h(64): error: first parameter of allocation function must be of type "size_t"

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\vcruntime_new.h(166): error: first parameter of allocation function must be of type "size_t"

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\vcruntime_new.h(182): error: first parameter of allocation function must be of type "size_t"

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\vcruntime_new_debug.h(26): error: first parameter of allocation function must be of type "size_t"

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\vcruntime_new_debug.h(34): error: first parameter of allocation function must be of type "size_t"

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(409): error: class template "std::_Is_memfunptr" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1699): error: class template "std::result_of" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1699): error: class template "std::result_of" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\type_traits(1799): error: class template "std::_Function_args" has already been defined

D:\Windows Kits\10\include\10.0.19041.0\ucrt\malloc.h(55): error: more than one instance of overloaded function "_alloca" has "C" linkage

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\crt/common_functions.h(125): error: first parameter of allocation function must be of type "size_t"

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\crt/common_functions.h(126): error: first parameter of allocation function must be of type "size_t"

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\crt/common_functions.h(267): error: first parameter of allocation function must be of type "size_t"

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\crt/common_functions.h(268): error: first parameter of allocation function must be of type "size_t"

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(132): error: cannot overload functions distinguished by return type alone

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(133): error: cannot overload functions distinguished by return type alone

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(134): error: cannot overload functions distinguished by return type alone

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(135): error: cannot overload functions distinguished by return type alone

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(136): warning #1581-D: declaration overloads built-in function "__nv_cvta_global_to_generic_impl"

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(136): error: more than one instance of overloaded function "__nv_cvta_global_to_generic_impl" has "C" linkage

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(137): warning #1581-D: declaration overloads built-in function "__nv_cvta_shared_to_generic_impl"

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(137): error: more than one instance of overloaded function "__nv_cvta_shared_to_generic_impl" has "C" linkage

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(138): warning #1581-D: declaration overloads built-in function "__nv_cvta_constant_to_generic_impl"

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(138): error: more than one instance of overloaded function "__nv_cvta_constant_to_generic_impl" has "C" linkage

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(139): warning #1581-D: declaration overloads built-in function "__nv_cvta_local_to_generic_impl"

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_20_intrinsics.hpp(139): error: more than one instance of overloaded function "__nv_cvta_local_to_generic_impl" has "C" linkage

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(104): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(105): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(109): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(110): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(111): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(112): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(113): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(114): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(115): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(116): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(117): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(118): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(119): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(120): error: asm operand type size(8) does not match type/size implied by constraint 'r'


D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(122): error: asm operand type size(8) does not match type/size implied by constraint 'r'

D:\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\sm_32_intrinsics.hpp(123): error: asm operand type size(8) does not match type/size implied by constraint 'r'

Error limit reached.
100 errors detected in the compilation of "add.cu".

However the most amusing thing is, it runs well when I compile it (add.cu) in cmd created by myself (not from Visual Studio).

D:\0_Personal_File\TMPTEST>nvcc add.cu -o add_cuda.exe
add.cu
   Creating library add_cuda.lib and object add_cuda.exp

Solution

  • I solved it (but is still confused without knowing the reason behind)!

    Here is the solution I followed

    In short, you may uncheck the "Beta: Use Unicode UTF-8 for world wide language support" box in the Region Settings.(I've checked it for another tool nsys, which is the utils to analysis the cuda, and its python somehow requires utf-8)

    how to find this box

    I noticed some messy code in the "output" of VS terminal, so I tried the solution above suspiciouly and, suprisingly, it worked!