Clion +VS2010 +CUDA7.5 +Cmake3.23.4 成功编译CUDA程序【首次 重要】
项目结构:
根目录的CMakeLists.txt文件
# CMakeLists.txt for G4CU project project(project) # required cmake version cmake_minimum_required(VERSION 2.8) add_subdirectory(cuda) set (EXTRA_LIBS ${EXTRA_LIBS} gpu) ADD_EXECUTABLE(project main.cpp) target_link_libraries (project ${EXTRA_LIBS})
main.cpp
#include <stdio.h> #include <iostream> extern "C" void useCUDA(); int main() { std::cout<<"Hello C++"<<std::endl; useCUDA(); return 0; }
cuda\CMakeLists.txt
# CMakeLists.txt for G4CU project project(gpu) # required cmake version cmake_minimum_required(VERSION 2.8) # packages find_package(CUDA) #include_directories ("${PROJECT_SOURCE_DIR}") # nvcc flags -g for debug #set(CUDA_NVCC_FLAGS -O3;-G;-g) #set(CUDA_NVCC_FLAGS -gencode arch=compute_20,code=sm_20;-G;-g) #set(CUDA_NVCC_FLAGS -gencode arch=compute_52,code=sm_52;-G;-g) file(GLOB_RECURSE CURRENT_HEADERS *.h *.hpp *.cuh) file(GLOB CURRENT_SOURCES *.cpp *.cu) source_group("Include" FILES ${CURRENT_HEADERS}) source_group("Source" FILES ${CURRENT_SOURCES}) #cuda_add_library(gpu SHARED ${CURRENT_HEADERS} ${CURRENT_SOURCES}) cuda_add_library(gpu STATIC ${CURRENT_HEADERS} ${CURRENT_SOURCES})
cuda\foo.cu
#include "foo.cuh" #define CHECK(res) { if(res != cudaSuccess){printf("Error :%s:%d , ", __FILE__,__LINE__); \ printf("code : %d , reason : %s \n", res,cudaGetErrorString(res));exit(-1);}} __global__ void foo() { printf("CUDA!\n"); } void useCUDA() { foo<<<1,5>>>(); CHECK(cudaDeviceSynchronize()); }
cuda\foo.cuh
#ifndef FOO_CUH #define FOO_CUH #include <stdio.h> extern "C" void useCUDA(); #endif
配置Toolchains
配置Cmake
编译 / 加载Cmake项目
编译/ build
输出
####################################################
第二种方案,代码理解
根目录CMakeLists.txt:
```
cmake_minimum_required(VERSION 2.8) project(project) add_subdirectory(cuda111)
```
cuda111的CMakeLists.txt
cmake_minimum_required(VERSION 2.8) project(cuda111) INCLUDE_DIRECTORIES(.) INCLUDE_DIRECTORIES("C:/Program Files (x86)/Microsoft Visual Studio 10.0/VC/include") INCLUDE_DIRECTORIES("C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v7.5/include") # packages find_package(CUDA) # nvcc flags -g for debug set(CUDA_NVCC_FLAGS -O3;-G;-g) //设置NVCC的编译优化; file(GLOB_RECURSE CURRENT_HEADERS *.h *.hpp *.cuh) //哪些cu文件需要被编译,添加到CURRENT_HEADERS变量里 file(GLOB CURRENT_SOURCES *.cpp *.cu) cuda_add_library(foo STATIC ${CURRENT_HEADERS} ${CURRENT_SOURCES}) //采用nvcc编译cu文件,生成foo.lib ADD_EXECUTABLE(cuda111 main.cpp) //生成cuda111.exe target_link_libraries (cuda111 foo) //需要link上foo.lib
main.cpp放在cuda111文件夹下
混合编译的本质时:
1、使用NVCC编译CU和cuh文件,生成xxxx.lib ;
2、使用VS2010的编译器(cl.exe)编译cpp文件生成,xxx.lib ;
3、最后将xxx.lib和xxxx.lib link到一起生成exe;
---------------------------------
第三种方案:
cmakelist修改为 CUDA_ADD_EXECUTABLE
cmake_minimum_required(VERSION 2.8) project(cuda111) INCLUDE_DIRECTORIES( . "C:/Program Files (x86)/Microsoft Visual Studio 10.0/VC/include" "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v7.5/include" ) # packages find_package(CUDA) file(GLOB_RECURSE CURRENT_HEADERS *.cuh) #哪些cu文件需要被编译,添加到CURRENT_HEADERS变量里 file(GLOB CURRENT_SOURCES *.cu) CUDA_ADD_EXECUTABLE(cuda111 main.cpp ${CURRENT_HEADERS} ${CURRENT_SOURCES} ) #生成cuda111.exe