在之前的文章【CUDA编程(1)】 初识CUDA编程 写了CUDA相关的知识。最近也在研究 并行异构的课程,在QT里面加入相关的cuda 代码试一下!

首先需要 在camke 中开启cuda,参考之前的文章【cmake开发(12)】Cmake同时编译cpp文件和cu文件

仓库地址

基于【QT开发(8)】QT 中使用tensorrt的项目文件进行修改。

地址https://gitee.com/hiyanyx/qt5.14-cpp_dds_-project/tree/add_cuda_helloworld
分支:add_cuda_helloworld

修改文件情况
在这里插入图片描述

1 cu文件单独配置cmakelists

项目目录下既有.cu文件又有.cpp文件,先将.cu编译为动态库,再由.cpp调用

CMakeLists.txt:

cmake_minimum_required(VERSION 3.17)
project(gpu_lib)
enable_language(CUDA)

aux_source_directory(. SRC_CUDA)
add_library(gpu_lib SHARED ${SRC_CUDA})
/* deploy.h */
#ifndef gpu_api
#define gpu_api 

extern "C"
int deploy();

#endif
/** deploy.cu **/
#include <stdio.h>
#include "deploy.h"

__global__ void square(float* d_out, float* d_in){
    int idx = threadIdx.x;
    float f = d_in[idx];
    d_out[idx] = f * f;
printf("Hello from GPU\n");
}

int deploy(){
    const int ARRAY_SIZE = 8;
    const int ARRAY_BYTES = ARRAY_SIZE * sizeof(float);

    float h_in[ARRAY_SIZE];
    float h_out[ARRAY_SIZE];
    for(int i = 0; i < ARRAY_SIZE; i++){
        h_in[i] = float(i);
    }

    float* d_in;
    float* d_out;

    cudaMalloc((void**) &d_in, ARRAY_BYTES);
    cudaMalloc((void**) &d_out, ARRAY_BYTES);

    cudaMemcpy(d_in, h_in, ARRAY_BYTES, cudaMemcpyHostToDevice);
    square<<<1, ARRAY_SIZE>>>(d_out, d_in);
    cudaMemcpy(h_out, d_out, ARRAY_BYTES, cudaMemcpyDeviceToHost);

    for(int i = 0; i < ARRAY_SIZE; i++){
        printf("%f", h_out[i]);
        if( i % 4 != 3 )
            printf("\t");
        else
            printf("\n");
    }

    cudaFree(d_in);
    cudaFree(d_out);

    return 0;
}

2 修改主 cmakelist 文件,引入这个gpu_lib 库

一般来说,主cmakelists 是不用开启 CUDA 支持的,我理解,可以在主 cmakelists 开启CUDA 支持,这样可以 配置 CUDA的架,nvcc 编译器地址等。

1、加入头文件

 # ===== 设置 include 目录路径 =====
target_include_directories ( emptyApp PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/deps/gpu_lib
    )

2、加入 子目录,编译 gpu_lib

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/deps/gpu_lib EXCLUDE_FROM_ALL)

3、添加动态库

    target_link_libraries( emptyApp 
                            gpu_lib )

3 cpp 中 修改 main.cpp 调用这个 gpu_lib 库

#include "pch.h"
#include "mainwindow.h"
#include "c.h"

#include <rclcpp/rclcpp.hpp>
#include "example.h"

#include <QApplication>
//-------------------- Main --------------------//
#include "A.h"
#include "SysConfig.h" // 此文件由 cmake 自己生成,并不在 src/ 目录中

#include "deploy.h"

int main( int argc, char* argv[] ){
		deploy();
        return 0;

}

演示

请添加图片描述

参考

https://blog.csdn.net/qq_43596950/article/details/130654274

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐