前言
之前是在vs中开发cuda的代码,现在需要把cuda的代码移植到QT中。
参考资料
本文参考:windows上使用QT creator运行cuda程序的pro配置
参考过的:
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
- 由于在配置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();
}
运行结果: