在之前的文章【CUDA编程(1)】 初识CUDA编程 写了CUDA相关的知识。最近也在研究 并行异构的课程,在QT里面加入相关的cuda 代码试一下!
首先需要 在camke 中开启cuda,参考之前的文章【cmake开发(12)】Cmake同时编译cpp文件和cu文件
文章目录
- 仓库地址
- 1 cu文件单独配置cmakelists
- 2 修改主 cmakelist 文件,引入这个gpu_lib 库
- 3 cpp 中 修改 main.cpp 调用这个 gpu_lib 库
- 演示
- 参考
仓库地址
基于【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