Bootstrap

QT中配置cuda环境,并编写cuda代码

前言

之前是在vs中开发cuda的代码,现在需要把cuda的代码移植到QT中。

参考资料

本文参考:windows上使用QT creator运行cuda程序的pro配置

参考过的:

  1. CUDA编程(一):QT中编写cuda代码
  2. Qt msvc编译器 配置 cuda开发环境

1. 前言

由于本机安装cuda时,是默认安装的,所以安装目录为

# CUDA_PATH  这个是安装cuda时自动配置到环境变量中的路径,也是cuda安装的路径
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1

在这里插入图片描述

cuda的样例文件夹位置为

C:\ProgramData\NVIDIA Corporation\CUDA Samples
# CUDA_SDK   sdk包的位置
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1\common

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJOZ2iaI-1677747641372)(.images/09-CUDA-QT配置/image-20221215162907476.png)]

  • 由于在配置qt pro时,cuda的路径不能有空格,所以新建一个文件夹,把 上述两个图中的内容(CUDA_PATH和CUDA_SDK下的内容)都拷贝过去
# 新建的文件夹
F:\Software\CUDA\v11.1

2.Qt Creator的 .pro配置

在Windows上用qt写界面,需要用到cuda,windows上qt配置cuda花了很长时间,现在分享出来。

windows上Qt Creator配置cuda与linux上大同小异。

QT +=core
TEMPLATE = app
CONFIG += c++11
CONFIG -= app_bundle
TARGET = simulation
SOURCES += main.cpp
HEADERS += algorithm.h

INCLUDEPATH +=F:\Software\CUDA\v11.1\include  \
 F:\Software\CUDA\v11.1\common\inc #Qt Creator配置路径不能包含空格,因此我把安装好的cuda新建了个文件夹
LIBS +=-LF:/Software/CUDA/v11.1/lib/x64 \
-lcudart \
-lcublas \
-lcufft
OTHER_FILES +=./algorithm.cu #要运行的程序
# Cuda sources
CUDA_SOURCES+=./algorithm.cu
CUDA_SDK ="F:/Software/CUDA/v11.1"
CUDA_DIR ="F:/Software/CUDA/v11.1"
QMAKE_LIBDIR += $$CUDA_DIR/lib/x64
SYSTEM_TYPE = 64
#不同的显卡注意填适当的选项
CUDA_ARCH = sm_75
NVCCFLAGS     = --use_fast_math
CUDA_INC = $$join("F:/Software/CUDA/v11.1/include",'" -I"','-I"','"')

# MSVCRT link option (static or dynamic, it must be the same with your Qt SDK link option)
MSVCRT_LINK_FLAG_DEBUG = "/MDd" #表示使用DLL的调试版
MSVCRT_LINK_FLAG_RELEASE = "/MD" #使用DLL版的C和C++运行库 具体可以看vs的属性设置

CUDA_OBJECTS_DIR = ./
# 配置编译器
CONFIG(debug, debug|release) {
# Debug mode
cuda_d.input = CUDA_SOURCES
cuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}algorithm.obj #windows的中间文件是obj格式,这个是需要修改d
cuda_d.commands = $$CUDA_DIR/bin/nvcc.exe -D_DEBUG $$NVCC_OPTIONS $$CUDA_INC $$CUDA_LIBS --machine $$SYSTEM_TYPE \
                 -arch=$$CUDA_ARCH -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME} -Xcompiler $$MSVCRT_LINK_FLAG_DEBUG
cuda_d.dependency_type = TYPE_C
QMAKE_EXTRA_COMPILERS += cuda_d
}
else {
# Release mode
 cuda.input = CUDA_SOURCES
 cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}algorithm.obj
 cuda.commands = $$CUDA_DIR/bin/nvcc.exe $$NVCC_OPTIONS $$CUDA_INC $$CUDA_LIBS --machine $$SYSTEM_TYPE \
    -arch=$$CUDA_ARCH -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME} -Xcompiler $$MSVCRT_LINK_FLAG_RELEASE
cuda.dependency_type = TYPE_C
 QMAKE_EXTRA_COMPILERS += cuda
}

3.示例代码

  • algorithm.h
#ifndef ALGORITHM_H
#define ALGORITHM_H
int  test_cuda(void);
#endif // ALGORITHM_H
  • algorithm.cu
#include <stdio.h>

// For the CUDA runtime routines (prefixed with "cuda_")
#include <cuda_runtime.h>


__global__ void
hello()
{
    int i = blockDim.x * blockIdx.x + threadIdx.x;

    printf("hello ");
}


/**
 * Host main routine
 */
int test_cuda(void)
{

    hello<<<1, 3>>>();

    cudaDeviceSynchronize();

    printf("Done\n");

    return 0;
}
  • main.cpp
#include <QCoreApplication>

#include "algorithm.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    test_cuda();
    return a.exec();
}

运行结果:

;