美文网首页
使用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