美文网首页
使用CMake构建一个简单的CUDA 加法程序

使用CMake构建一个简单的CUDA 加法程序

作者: FredricZhu | 来源:发表于2023-08-05 21:41 被阅读0次

CUDA 编程是非常傻瓜式的C程序。比较麻烦的是需要把环境配好。
在Linux环境上面就比较容易配环境。
首先需要安装CUDA driver。

# 查看一下 当前机器支持的drivers,选那个recommend的就行
sudo ubuntu-drivers devices
# 这个需要卸载一些部件,安装一些部件,在ubuntu上面可能导致无法开机,建议不要在工作机上面搞,风险太大
sudo aptitude install nvidia-driver-535

接着可能还需要安装nvidia-development-tookit

sudo aptitude install nvidia-cuda-toolkit

这样搞完验证一下显卡驱动,

nvidia-smi

如果输出如下,就应该可以上车了。
---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.05 Driver Version: 535.86.05 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce MX130 Off | 00000000:01:00.0 Off | N/A |
| N/A 50C P5 N/A / 200W | 330MiB / 2048MiB | 13% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------

接下来如果是ubuntu 20.04,可能还需要降级一下GCC9到GCC8。
可以采用如下页面展示的方法来解决。
https://blog.csdn.net/weixin_42217899/article/details/126814206

然后就可以使用CMake来编译CUDA程序了。
本文使用conan来做包管理。
conanfile.txt

[requires]
boost/1.72.0
opencv/4.5.5



[generators]
cmake

CMakeLists.txt

cmake_minimum_required(VERSION 3.3)

project(1_simpe_add)

set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/usr/local/lib/pkgconfig/")

set ( CMAKE_CXX_FLAGS "-pthread")
set(CMAKE_CXX_STANDARD 17)
add_definitions(-g)

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

find_package(CUDA)

include_directories(${INCLUDE_DIRS})
LINK_DIRECTORIES(${LINK_DIRS})

if (CUDA_FOUND)

    file( GLOB main_file_list ${CMAKE_CURRENT_SOURCE_DIR}/*.cu)

    foreach( main_file ${main_file_list} )
        file(RELATIVE_PATH filename ${CMAKE_CURRENT_SOURCE_DIR} ${main_file})
        string(REPLACE ".cu" "" file ${filename})
        CUDA_ADD_EXECUTABLE(${file}  ${main_file})
        target_link_libraries(${file} ${CUDA_LINK_LIBRARIES_KEYWORD}  pthread)
        target_link_libraries(${file} ${CUDA_LINK_LIBRARIES_KEYWORD}  ${CONAN_LIBS})
    endforeach( main_file ${main_file_list})
else()
    message("CUDA not found!")
endif()

utilities.h

#ifndef _FREDRIC_UTILITIES_H_
#define _FREDRIC_UTILITIES_H_

#include "cuda.h"
#include <stdio.h>

static void HandleError(cudaError_t err, 
                char const* file, 
                int line) {
    if(err != cudaSuccess) {
        printf("%s in %s at line %d\n", cudaGetErrorString(err), file, line);
        exit(EXIT_FAILURE);
    }
}

#define HANDLE_ERROR(err) (HandleError(err, __FILE__, __LINE__))

#endif

simple_add.cu

#include <iostream>
#include <string>
#include <sstream>
#include <utility>
#include <memory>
#include "utilities.h"
#include <boost/lexical_cast.hpp>

__device__ int addem(int a, int b) {
    return a+b;
}

__global__ void add(int a, int b, int *c) {
    *c = addem(a, b);
}

int main(int argc, char* argv[]) {
    int c;
    int *dev_c;
    HANDLE_ERROR(cudaMalloc((void**)&dev_c, sizeof(int)));
    add<<<1, 1>>>(2, 7, dev_c);
    HANDLE_ERROR(cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost));
    std::cout << "2 + 7 = " << c << "\n";
    HANDLE_ERROR(cudaFree(dev_c));
    return EXIT_SUCCESS;
}

程序会简单的在 GPU上计算2+7=9,然后把结果 拷贝回CPU,使用std::cout进行输出。

相关文章

网友评论

      本文标题:使用CMake构建一个简单的CUDA 加法程序

      本文链接:https://www.haomeiwen.com/subject/ankipdtx.html