CUDA编译(二)---用CMake混合编译C++与cuda

xiaoxiao2021-02-28  30

#CUDA编译(二)—用CMake混合编译C++与cuda

引言示例

#引言 许多c/c++的项目会使用cuda加速其算法,c/c++有其编译器:gcc/g++,cuda有其编译器nvcc。为了实现我们的目的,我们一般采用gcc/g++编译c/c++部分代码,nvcc编译cuda代码部分,即分离式编译。如此博文nvcc gcc g++混合编译器编程。 分离式编译的基本思路: 将cuda部分写成接口: void API(){...} 在c/c++代码中通过添加接口声明: extend "C" void API(){...} 这样g++编译器就可以只处理C++有关代码,含有cuda代码的部分就由nvcc处理。 只添加声明是不够的,要真正实现调用并完成功能,需要有真正的函数实现,即要将cuda接口制作成静态库或动态库,c++通过调用声明并调用库中的实现来完成功能。 同时,我们常常需要构建一个具体的项目,CMake工具便是一个很好的选择。我们可以使用CMake工具,将cuda部分作为一个项目并制作为库,由其主项目调用。


#示例 目录树:

main.cpp CMakeLists.txt cuda(文件夹) --CMakeLists.txt --foo.cuh --foo.cu

它们分别是: main.cpp:

#include <stdio.h> #include <iostream> extern "C" void useCUDA(); int main() { std::cout<<"Hello C++"<<std::endl; useCUDA(); return 0; }

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})

foo.cuh:

#ifndef FOO_CUH #define FOO_CUH #include <stdio.h> extern "C" void useCUDA(); #endif

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()); }

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_add_library(gpu SHARED ${CURRENT_HEADERS} ${CURRENT_SOURCES})生成动态库。 cuda_add_library(gpu STATIC ${CURRENT_HEADERS} ${CURRENT_SOURCES})生成静态库。


修改: main.cpp 也可以是

#include <stdio.h> #include <iostream> #include "cuda/foo.cuh" int main() { std::cout<<"Hello C++"<<std::endl; useCUDA(); return 0; }
转载请注明原文地址: https://www.6miu.com/read-2602569.html

最新回复(0)