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

7 篇文章 3 订阅

#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;
}
  • 24
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值