CUDA与C++ 混合使用的目的是GPU加速C++程序,适合并行计算较多的情况。以下为实现步骤:

1、确定电脑有GPU,并安装对应版本的CUDA,配置CUDA如下:

装好CUDA 5.5 sdk后,默认会自动添加好系统环境变量。如果有问题可能是环境变量不全,可参考网上的教程,再次配置。

2、配置VS

将bin/lib/Include仿照opencv等三方库的配置方法进行VS配置。

关键:

11、右键工程-->生成依赖项->生成自定义 ,将对话框中CUDA5.5前面的勾打上。(切记不是属性里的)

22、右键xx.cu文件-->属性,在 常规-->项类型 里面选择CUDA C/C++(由于cu文件是由nvcc编译的,这里要修改编译链接属性)

至此,配置完毕。

3、CUDA与C++实现:

通过性能分析工具(如vs)找到CPU程序最耗时的多个地方,并确定耗时程序的入口函数
将CPU函数进行清理 
1.将循环部分的代码找出来。 
2.将函数内所用到的数据从C++类结构变成C的结构体。 
3.标准化输入输出,保证其为C结构,并与原程序的数据进行无缝对接。 
4.将循环内部的函数也做相同处理,最终得到C版本的且输入输出与原程序对接的CPU程序。 
5.保证清理后的CPU程序正常正确运行。
将清理后的CPU函数变为cuda核函数 
1.申请设备内存 
2.拷贝主机内存到设备内存 
3.核函数计算 
4.拷贝设备内存回主机内存 
5.释放资源
优化cuda核函数
性能分析
以下为一个简单的例子

#include "cuda_runtime.h"
#include "device_launch_parameters.h"  #include<cuda.h>bool InitCUDA(void)
{int count = 0;int i = 0;cudaGetDeviceCount(&count);if (count == 0) {fprintf(stderr, "There is no device.\n");return false;}for (i = 0; i < count; i++) {cudaDeviceProp prop;if (cudaGetDeviceProperties(&prop, i) == cudaSuccess) {if (prop.major >= 1) {break;}}}if (i == count) {fprintf(stderr, "There is no device supporting CUDA.\n");return false;}cudaSetDevice(i);printf("CUDA initialized.\n");cudaDeviceProp prop;cudaGetDeviceProperties(&prop, i);printf("Device : \" %s \" \n\n", prop.name);return true;
}/.cu
__global__ void init(float *Cs, float *Ct, float *ps, float *pt, float *u, int nPixelNum) {int g_idx;const int bid = blockIdx.x;const int tid = threadIdx.x;for (g_idx = bid * THREAD_NUM + tid; g_idx < nPixelNum; g_idx += THREAD_NUM * BLOCK_NUM){if (Cs[g_idx] - Ct[g_idx] >= 0){u[g_idx] = 1.0f;}ps[g_idx] = MIN(Cs[g_idx], Ct[g_idx]);pt[g_idx] = ps[g_idx];  }
}extern "C" ///CUDA 通过C嵌入C++
void runMaxFlow()
{
.....
int nPixelNum = Ny*Nx;float * dev_Cs = 0;float * dev_Ct = 0;........cudaError_t cudaStatus;// Allocate GPU buffers for three vectors (two input, one output)    . cudaStatus = cudaMalloc((void**)&dev_cvg, sizeof(float));cudaStatus = cudaMalloc((void**)&dev_Cs,  nPixelNum * sizeof(float));.........// Copy input vectors from host memory to GPU buffers.  cudaStatus = cudaMemcpy(dev_Cs, Cs, nPixelNum * sizeof(float), cudaMemcpyHostToDevice);cudaStatus = cudaMemcpy(dev_Ct, Ct, nPixelNum * sizeof(float), cudaMemcpyHostToDevice);.....if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMalloc failed!");goto Error;}init << <  BLOCK_NUM, THREAD_NUM >> >(dev_Cs, dev_Ct, dev_ps, dev_pt, dev_u, nPixelNum);//调用内核核函数
cudaStatus = cudaGetLastError();if (cudaStatus != cudaSuccess) {fprintf(stderr, "runMaxFlow_GPU 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, "cudaMalloc failed!");goto Error;}
Error://释放内存cudaFree(dev_Cs);cudaFree(dev_Ct);}/cpp(不用包含cu文件)extern "C" void runMaxFlow(float *Cs, float *Ct, float *alpha, float *pars, float *u);//必须......
runMaxFlow(Cs.data(), Ct.data(), alpha.data(), pars, u.data());//正常调用即可
......

Cuda的内存分配机制搞不清,考虑循环中多次申请、释放内存耗时,想申请一块全局或Static指针内存,函数中直接cudaMemcpy,程序报拷贝异常,也试着将外边分配好的GPU内存传入函数后再cudaMemcpy,同样异常

在一个核函数里不用for (g_idx = bid * THREAD_NUM + tid; g_idx < nPixelNum; g_idx += THREAD_NUM * BLOCK_NUM),直接写普通函数,得出来的值是不对的,不知为啥。

gpu 程序目前本人没有debug 成功,唯一的调试方法是核函数外转成cpu数据,此时就要逐行注释核函数的语句,比较耗费时间。

CUDA与C++混合编程相关推荐

  1. CUDA 8的混合精度编程

    CUDA 8的混合精度编程 Volta和Turing GPU包含 Tensor Cores,可加速某些类型的FP16矩阵数学运算.这样可以在流行的AI框架内更快,更轻松地进行混合精度计算.要使用Ten ...

  2. C与CUDA混合编程的配置问题

    C与CUDA混合编程的配置问题 2015-10-05 19:58 526人阅读 评论(2) 收藏 举报 分类: CUDA(6) 目录(?)[+] 原文: http://blog.csdn.net/u0 ...

  3. CUDA、SU、MPI和Madagascar混合编程的Makefile文件配置

    本人从事地震勘探的科研工作,在Ubuntu系统中用CUDA.SU.MPI和Madagascar做C语言的混合编程.多语言混合编程,关键之处在于Makefile文件的配置.在此给出一个简单的示例,供大家 ...

  4. Java与Cuda混合编程

    基本上和Java与C语言混合编程(链接)相同,就是在生成动态库的编译过程不同. 首先编写一个名为Main.java的文件,内容如下: class NativeMethod{public native ...

  5. Gtk与Cuda混合编程

    大家都知道,不同的编译器有不同的-L和-I,而在编译过程中要实现两种编译器的混合使用,利用Makefile是一个很好地解决方案,比如之前在mpi与cuda混合编程中讨论的那样,基于图形界面的GTK编程 ...

  6. Mpi与Cuda混合编程(Makefile)

    需要建立一个.c的MPI程序和一个.cu的CUDA程序,MPI程序中调用CUDA中的函数来完成并行与GPU的混合编程,我查询了很多资料和博客,最终得出结论,还是Google比较强大,百度什么的还是搜不 ...

  7. c++和cuda混合编程记录(一)

    最近在用cuda将RT并行化. 很多人都说,最好使用c来写cuda,不要用类,尽量用struct代替.因为在cuda里面使用oo来套现在会有很多问题. 我也试过,确实很多问题,之前用cpp写的光线追踪 ...

  8. SU(Seismic Unix)与CUDA的混合编程

    当前,众多的学者在Linux下面用SU做地震勘探的编程,并与CUDA做融合,进行GPU编程开发.本人研究FWI(全波形反演),也是用CUDA+SU的方式编程C语言的程序. 那么在编写MakeFile文 ...

  9. matlab两个多项式相除,C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

最新文章

  1. 在2020年,你觉得计算机视觉有哪些值得研究的领域?
  2. javafx爬取网页并且初始化网页数据
  3. 打造大型直播平台之《PC客户端架构》
  4. 数据分析(SQL)常见面试题:开窗函数
  5. 跨浏览器的placehold
  6. 堆内存里的各种奇怪填充值
  7. 关于 IdentityServer4 中的 Jwt Token 与 Reference Token
  8. jQuery图片垂直滚动焦点图
  9. Zurmo - - 国际化(翻译)
  10. Charles抓包基本应用
  11. Jade的安装与测试
  12. pyecharts中文手册
  13. TVS参数详解及选型应用
  14. html毕业论文参考文献,本科毕业论文参考文献规范格式
  15. 数据集Freebase-FB13
  16. Problem E: Pineapple
  17. PAT甲级英文单词整理
  18. 【原创】《矩阵的史诗级玩法》连载十六:二元二次方程一般式和圆锥曲线的关系(下)
  19. Python项目:The Ship Rendezvous Problem,利用贪心算法解决船舶交会问题
  20. html象棋开题报告设计要求,C++游戏设计中国象棋开题报告.docx

热门文章

  1. 了解IT专业,选对IT专业
  2. 14本人工智能技术入门书籍下载
  3. 解决因电脑自身问题导致EasyConnect无法连接或频繁更新闪退的问题(自用)
  4. js实现页面数据的筛选
  5. 有没有好用的资产管理系统推荐(免费好用的it资产管理系统)
  6. CoordinatorLayou
  7. python中不同进制的整数之间可以直接运算吗_【python公开课|要想真的做好python,那么学会python整数的不同进制很重要】- 环球网校...
  8. 微博开放平台SDK 移动端的H5方式授权过程分析
  9. 学术成果的认定范围及计算标准
  10. Ubuntu 18下C/C++ IDE之CodeLite安装