本文基于的情况是,Qt,CUDA和VS已经安装完成且能够正常运行的情况

  1. 创建一个空的Qt项目
  2. 创建一个.cu文件,本文创建的为kernel.cu
    内容如下
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);
__global__ void addKernel(int *c, const int *a, const int *b)
{int i = threadIdx.x;c[i] = a[i] + b[i];
}
extern "C"
void run()
{const int arraySize = 5;const int a[arraySize] = { 1, 2, 3, 4, 5 };const int b[arraySize] = { 10, 20, 30, 40, 50 };int c[arraySize] = { 0 };// Add vectors in parallel.cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);if (cudaStatus != cudaSuccess) {fprintf(stderr, "addWithCuda failed!");return;}printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n",c[0], c[1], c[2], c[3], c[4]);// cudaDeviceReset must be called before exiting in order for profiling and// tracing tools such as Nsight and Visual Profiler to show complete traces.cudaStatus = cudaDeviceReset();if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaDeviceReset failed!");return;}
//    return 0;
}
// Helper function for using CUDA to add vectors in parallel.
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size)
{int *dev_a = 0;int *dev_b = 0;int *dev_c = 0;cudaError_t cudaStatus;// Choose which GPU to run on, change this on a multi-GPU system.cudaStatus = cudaSetDevice(0);if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");goto Error;}// Allocate GPU buffers for three vectors (two input, one output)    .cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMalloc failed!");goto Error;}cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMalloc failed!");goto Error;}cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMalloc failed!");goto Error;}// Copy input vectors from host memory to GPU buffers.cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMemcpy failed!");goto Error;}cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMemcpy failed!");goto Error;}// Launch a kernel on the GPU with one thread for each element.addKernel<<<1, size>>>(dev_c, dev_a, dev_b);// Check for any errors launching the kernelcudaStatus = cudaGetLastError();if (cudaStatus != cudaSuccess) {fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus));goto Error;}// cudaDeviceSynchronize waits for the kernel to finish, and returns// any errors encountered during the launch.cudaStatus = cudaDeviceSynchronize();if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);goto Error;}// Copy output vector from GPU buffer to host memory.cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMemcpy failed!");goto Error;}Error:cudaFree(dev_c);cudaFree(dev_a);cudaFree(dev_b);return cudaStatus;
}
  1. 编写pro文件
CONFIG += consoleTARGET = test# Define output directories
DESTDIR = ../bin
CUDA_OBJECTS_DIR = OBJECTS_DIR/../cuda# This makes the .cu files appear in your project
CUDA_SOURCES += \kernel.cu# MSVCRT link option (static or dynamic, it must be the same with your Qt SDK link option)
MSVCRT_LINK_FLAG_DEBUG   = "/MDd"
MSVCRT_LINK_FLAG_RELEASE = "/MD"# CUDA settings
CUDA_DIR = $$(CUDA_PATH)            # Path to cuda toolkit install
SYSTEM_NAME = x64                   # Depending on your system either 'Win32', 'x64', or 'Win64'
SYSTEM_TYPE = 64                    # '32' or '64', depending on your system
CUDA_ARCH = sm_50                   # Type of CUDA architecture
NVCC_OPTIONS = --use_fast_math# include paths
INCLUDEPATH += $$CUDA_DIR/include \$$CUDA_DIR/common/inc \$$CUDA_DIR/../shared/inc# library directories
QMAKE_LIBDIR += $$CUDA_DIR/lib/$$SYSTEM_NAME \$$CUDA_DIR/common/lib/$$SYSTEM_NAME \$$CUDA_DIR/../shared/lib/$$SYSTEM_NAME# The following makes sure all path names (which often include spaces) are put between quotation marks
CUDA_INC = $$join(INCLUDEPATH,'" -I"','-I"','"')# Add the necessary libraries
CUDA_LIB_NAMES = cudart_static kernel32 user32 gdi32 winspool comdlg32 \advapi32 shell32 ole32 oleaut32 uuid odbc32 odbccp32 \#freeglut glew32for(lib, CUDA_LIB_NAMES) {CUDA_LIBS += -l$$lib
}
LIBS += $$CUDA_LIBS# Configuration of the Cuda compiler
CONFIG(debug, debug|release) {# Debug modecuda_d.input = CUDA_SOURCEScuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.objcuda_d.commands = $$CUDA_DIR/bin/nvcc.exe -D_DEBUG $$NVCC_OPTIONS $$CUDA_INC $$LIBS \--machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH \--compile -cudart static -g -DWIN32 -D_MBCS \-Xcompiler "/wd4819,/EHsc,/W3,/nologo,/Od,/Zi,/RTC1" \-Xcompiler $$MSVCRT_LINK_FLAG_DEBUG \-c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}cuda_d.dependency_type = TYPE_CQMAKE_EXTRA_COMPILERS += cuda_d
}
else {# Release modecuda.input = CUDA_SOURCEScuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.objcuda.commands = $$CUDA_DIR/bin/nvcc.exe $$NVCC_OPTIONS $$CUDA_INC $$LIBS \--machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH \--compile -cudart static -DWIN32 -D_MBCS \-Xcompiler "/wd4819,/EHsc,/W3,/nologo,/O2,/Zi" \-Xcompiler $$MSVCRT_LINK_FLAG_RELEASE \-c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}cuda.dependency_type = TYPE_CQMAKE_EXTRA_COMPILERS += cuda
}SOURCES += \main.cpp

需要注意,path中需要有CUDA_PATH的环境变量,如果没有需要自行添加

  1. 编译运行即可

使用Qt编写CUDA程序相关推荐

  1. Qt编写OpenMP程序--循环测试

    第一篇:https://blog.csdn.net/hats8888/article/details/46378281 最近一个客户需要处理大量股票数据,并跑到数据库里,原来的程序导入数据到数据库需要 ...

  2. windows下如何使用QT编写dll程序 .

    Windows 下如何使用 QT 编写 dll 程序 因为 QT 必须有调用 QApplication 的 exec 方法,这样才能产生消息循环, QT 的程序才可以运行.所以说如果我们使用了 QT ...

  3. Qt编写OpenMP程序--HelloWorld

    本程序是在Ubuntu Linux环境下编写成的.这里包括C++语言程序和C语言程序,两者在Qt项目设置参数上略有不同,需要注意. OpenMp提供并行描述,可以充分使用计算机系统的CPU资源. st ...

  4. Qt编写OpenMP程序--双循环

    本程序是在Ubuntu Linux环境下编写成的.OpenMp提供并行描述,可以充分使用计算机系统的CPU资源. Qt项目与C语言源程序: 1.Qt项目文件 TEMPLATE = app CONFIG ...

  5. Qt 编写应用程序升级的配置文件json 生成工具

    通过此工具将需要更新的应用程序和相关目录下的依赖文件配置成json格式的升级文件,客户端版本监控软件通过读取此json文件,对比相应字段,实现自动拉取文件,从而保证客户端应用程序自动更新. 此json ...

  6. Qt单实例程序-->禁止程序多开

    一.前言 Qt编写的程序,默认是可以多开的,但是有些时候,我们不希望程序可以同时打开多个,这时候就需要对程序的启动添加限制策略,阻止程序多开. 二.常用的三种方法 1.使用共享内存 原理:运行主函数前 ...

  7. 使用Qt编写模块化插件式应用程序

    动态链接库技术使软件工程师们兽血沸腾,它使得应用系统(程序)可以以二进制模块的形式灵活地组建起来.比起源码级别的模块化,二进制级别的模块划分使得各模块更加独立,各模块可以分别编译和链接,模块的升级不会 ...

  8. 【转】Qt编写串口通信程序全程图文讲解

    Qt编写串口通信程序全程图文讲解 本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或 ...

  9. Qt编写串口通信程序全程图文讲解

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三 ...

最新文章

  1. 再谈Windows Service - 一个简单的自我例子和部署
  2. 为什么 Django 能持续统治 Python 开发世界
  3. 3.6 迁移故障恢复
  4. C语言封装带省略参数的函数,C与C++的函数声明中省略参数的不同意义
  5. LoadPostData 的一些注意事项
  6. 《Python Cookbook 3rd》笔记(3.6):复数的数学运算
  7. Python标准库shutil中rmtree()使用回调函数
  8. Largest Number(leetcode 179)
  9. C++ 从入门到入土(English Version)Section5: Real numbers + bitwise operations
  10. Wordpress 太过牛
  11. 如何用计算机解一元三次方程,利用Excel电子表格解一元三次方程
  12. IT行业都有哪些职位
  13. 姓名生成---拼音简码(大小写)---拼音全码(大小写)
  14. winpe安装Windows 10系统时efi part有红叉怎么办。
  15. android gps定位误差,Android的GPS定位速度不可靠
  16. Unity PBR材质
  17. 手淘推出“店铺二楼”
  18. KEIL工程文件打不开
  19. 什么是生产管理?制造企业想要做好生产管理应该怎么做?
  20. iOS 火星坐标系 与 地球坐标系

热门文章

  1. 读秒 CountDownTimer
  2. wireshark过滤网段和域名
  3. 解决Bugfree不能定期发送统计邮件的问题
  4. 删除百度网盘右键菜单的脚本
  5. 做个好老公,老公对老婆的十大戒条
  6. 江苏省泰州中学2021年高考成绩查询,江苏泰州:2021年全国高考开考
  7. WHIP 和 WHEP 协议简介
  8. K短路问题(A*启发式广搜)
  9. SpringBoot学习笔记~狂神
  10. matlab画三维约束图命令,Matlab画三维图的方法