CUDA和C++混合编程及CMakeLists.txt

这篇具有很好参考价值的文章主要介绍了CUDA和C++混合编程及CMakeLists.txt。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 概要

首先认识一个问题,单从CMakeLists.txt的角度来看,无法同时使用两种编译器编译两种语言。不过直接编写Makefile是可以的,通过设置不同的任务,可以实现一个Makefile编译两个语言。但这不是这里要讨论的重点。
使用CUDA和C++进行混合编程的意思是:在cpp文件中调用CUDA函数,实现加速。
所以混合编程有两种方法:
1.1 直接编译
1.2 将CUDA工程编译成库,然后在我们的cpp工程中使用target_link_libraries()来链接到我们刚编译好的CUDA库。

2. 注意点

我们要做的事情是将CUDA工程编译成库,然后在我们的cpp工程中使用target_link_libraries()来链接到我们刚编译好的CUDA库。
有几个需要注意的地方,下面这些都是在cpp的CMakeLists.txt中:

  1. The project() command will initialize many CMake variables concerning your system and compiler. As such, it sets the languages that your CMake project will be using. Without specifying any language in the project() command, the defaults (C and CXX) are enabled:

    # Initialize for C and C++ languages.
    project(cmake_and_cuda)
    

    啥意思?意思是说,CMakeLists.txt中的 project() 作用是根据你的系统和编译器初始化CMake变量,所以,projects()的作用是设置你CMake项目的语言,如果没有特别指出,默认使用C和CXX

  2. project() 应该紧跟在cmake_minimum_required()后面,这里因为我们需要引用cuda库,所以需要设置语言的时候加上cuda,有两种方式:

    project(cmake_and_cuda CUDA CXX)
    # 或者如下:
    project(cmake_and_cuda CUDA CXX)
    enable_language(CUDA)
    
  3. 设置CUDA架构
    后面的数值需要根据显卡来确定,查阅 https://developer.nvidia.com/cuda-gpus,比如我的是8.6这里就设置86

    set(CMAKE_CUDA_ARCHITECTURES 86)
    
  4. 给cuda库进行编译,并且链接到cpp程序中去【直接编译的方法跳过】

    add_subdirectory(kernels)
    target_link_libraries(main kernels)
    

3. 实现

main.cpp

#include "kernels/test.cuh"

int main() {
  wrap_test_print();

  return 0;
}

版本一:
直接编译:

cmake_minimum_required(VERSION 3.8 FATAL_ERROR)

project(cmake_and_cuda)
set(CMAKE_CUDA_ARCHITECTURES 86)
enable_language(CUDA)
# 把cu当成普通cpp来用
add_executable(main main.cpp kernels/test.cu)

版本二:
编译CUDA成库再链接方式的CMakeLists.txt

cmake_minimum_required(VERSION 3.8 FATAL_ERROR)

project(cmake_and_cuda)

set(CMAKE_CUDA_ARCHITECTURES 86)
#set(CMAKE_CUDA_COMPILER /usr/local/cuda-11.1/bin/nvcc)
#set(CUDACXX /usr/local/cuda-11.1/bin/nvcc)

enable_language(CUDA)

add_executable(main main.cpp)
add_subdirectory(kernels)

# set_property(TARGET main 
#              PROPERTY CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(main kernels)

test.cuh:cuda的头文件

#ifndef TEST_CUH__
#define TEST_CUH__

#include <stdio.h>

void wrap_test_print();

#endif

test.cu

#include "test.cuh"
__global__ void test_print(){
  printf("Hello World!\n");
}

void wrap_test_print() {
  test_print<<<1, 1>>>();
  cudaDeviceSynchronize();
  return;
}

cuda的CMakeLists.txt【直接编译的方法不要这个CMakeLists.txt】

enable_language(CUDA)
add_library(kernels
test.cu
test.cuh
)
target_compile_features(kernels PUBLIC cxx_std_11)
set_target_properties(kernels
                       PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(kernels)

最终目录结构:

├── CMakeLists.txt
├── kernels
│   ├── CMakeLists.txt
│   ├── test.cu
│   └── test.cuh
└── main.cpp

编译运行,输出Hello World!

4. CLion注意点

如果你用的是clion来编写cpp和cuda的混合,很有可能你直接使用界面上的运行按钮会报错,找不到文件blabla…,比如fatal error: cuda_runtime.h: 没有那个文件或目录,但是其实你从终端里面cmake make是能通过也是正常执行的,只要你在终端编过一次,IDE中即使一堆报错波浪线也可以run,很莫名其妙。

解决办法,在CMakeLists中加上一句include_directories(/usr/local/cuda-11.1/targets/x86_64-linux/include),这里的路径可以通过在命令行执行locate cuda_runtime.h来获得,这样所有clion中所有和cuda相关的报红色波浪线的地方都可以加上#include <cuda_runtime.h>,这样就可以愉快的CLion来运行和调试代码啦!文章来源地址https://www.toymoban.com/news/detail-676546.html

到了这里,关于CUDA和C++混合编程及CMakeLists.txt的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Gradio快速搭建ML/DL Web端服务

    当我们训练好了某个模型并且效果还不错时,最先想到的应该是 部署 .部署又可以分为线上Web服务和边缘模块上;为了汇报的时候往往还是选择线上部署,毕竟盒子部署好了还得配置相应的硬件输入也不方便展示.在这个专栏之前尝试用 fastapi 搭建了Web服务,并且将一些算法模型部

    2024年02月11日
    浏览(77)
  • cmake中多级CMakeLists.txt调用

      在c/c++工程开发中,往往会涉及多级CMakeLists.txt的调用,并且调用方式错综复杂,主要有以下两种方式: 子目录中的CMakeLists.txt 独立生成目标 ,不作为主目标生成过程主的依赖存在,与主目标并无任何关系。 子目录中的CMakeLists.txt 作为主目标的依赖源文件 ,不单独生成

    2024年02月02日
    浏览(39)
  • ROS功能包目录下CMakeLists.txt

    CMake基础教程(24)add_executable生成目标可执行文件 CMake中add_executable的使用 CMake中的add_executable命令用于使用指定的源文件向项目(project)添加可执行文件,其格式如下: 这里我们用到 Normal Executables这种用法,Normal Executables:添加一个名为的可执行目标(executable target),该目标将

    2024年02月11日
    浏览(39)
  • vs项目转cmake(.sln转CMakeLists.txt)

    proj2cmake https://github.com/mrpi/proj2cmake 另附cmake镜像站:https://cmake.org/files/ 编译proj2cmake时报错: 可参考 https://www.cnblogs.com/tang-zhou-zhou/p/16067695.html 编译boost 使用vs2017的x64_x86交叉工具命令提示符进入解压后的boost文件夹运行bootstrap.bat toolset:编译器 msvc-17.0(vs2017)gcc(mingw) pre

    2024年02月09日
    浏览(48)
  • webassembly003 whisper.cpp的项目结构CMakeLists.txt

    注:带星号的为非重要部分 POSIX:可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ) Core ML 是一个 Apple 框架,允许开发人员轻松集成 机器学习 (ML) 模型到应用中。Core ML 可在 iOS、iPadOS、 watchOS、macOS 和 Apple tvOS。Core ML 引入了公共文件格式 (.mlmodel)

    2024年01月18日
    浏览(51)
  • 【杂物间3】AI,ML,RL,DL,NLP,CV…搞清了这些是啥

    【pre】 在看一篇公众号推文的时候,里面有这么一句话:  诶,看这意思,CV,NLP,RL,GNN是DL的纵向领域?其他三个尚且眼熟,但RL是什么呢? 于是我去阅读了1、2,把 我觉得有用的 简单整理一下。 【content】 1、AI、ML、RL、DL的关系 (1)AI:人工智能(Artificial Intelligence,

    2024年02月05日
    浏览(36)
  • 【gcc, cmake, eigen, opencv,ubuntu】五.CMakeLists.txt编写

    1.CMakeLists.txt模板 一个使用opencv 的 CMakeLists.txt 对应的目录: 2.设置编程语言版本 3.设置编译类型Debug,Release 4.设置获取文件列表 MATH_LIB_SRC 指示:找到的math目录下的 c文件 5.添加include目录 表示在src/include/目录中寻找头文件 include_directories(src/include) 6.配置编译选项 add_compile_

    2024年02月09日
    浏览(40)
  • Android JNI配置CMakeLists.txt修改.cpp在logcat打印日志

    Android JNI配置CMakeLists.txt修改.cpp在logcat打印日志 C/C++代码里面常用的printf没法在Android 的logcat输出显示。需要特别配置C++才能显示在logcat里面。 (1)CMakeLists.txt定义: (2).cpp中: Android添加C++/CPP项目代码(2)_zhangphil的博客-CSDN博客 基于Windows平台,Android NDK(JNI)开发技术》

    2024年02月03日
    浏览(44)
  • ncnn - ubuntu调用vulkan加速ncnn是的CMakeLists.txt和bashrc配置

    ncnn使用vulkan来加速时,需要先安装vulkan,然后再使用vulkan来编译ncnn,最后才是使用编译好的ncnn来推理模型。。 这里的vulkan再Ubuntu中通常是直接解压安装,然后配置环境变量如下: export VULKAN_SDK=/home/fwq/softs/1.2.182.0/x86_64 1.2.182.0 是我使用的vulkan版本。。 配置完上述路径后,

    2024年01月23日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包