今天买了本新书《高性能CUDA应用设计与开发方法与最佳实践》,今天读了第一章有点出获,分享给大家。

程序功能:给向量填充数据并计算各元素之和

1. CPU串行运行的代码:

//seqSerial.cpp:串行执行数组的填充及求和

#include<iostream>

#include<vector>

using namespace std;

int main()

{

 const int N=50000;
 //任务1:创建数组

 vector<int> a(N);
 //任务2:填充数组

 for(int i=0;i<N;i++)a[i]=i;
 //任务3:计算数组各元素之和

 int sumA=0;

 for(int i=0;i<N;i++)sumA+=a[i];

 //任务4:计算0-N-1之和

 int sumCheck=0;

 for(int i=0;i<N;i++)sumCheck+=i;

 //任务5:检查结果是否正确

 if(sumA==sumCheck) cout<<"Test Succeeded!"<<endl;

 else {cerr<<"TestFailed!"<<endl;return(1);}

 return (0);

}

2.Cuda Thrust C++ API 程序

#include<iostream>

using namespace std;

#include<thrust\/reduce.h>

#include<thrust/sequence.h>

#include<thrust/host_vector.h>

#include<thrust/device_vector.h>

int main()

{

 const int N=50000;
 //任务1:创建数组

 thrust::device_vector<int>a(N);
 //任务2:填充数组,并行运算

 thrust::sequence(a.begin(),a.end(),0);

 //任务3:计算数组元素之和,并行计算
 int sumA=thrust::reduce(a.begin(),a.end(),0);

 //

 int sumCheck=0;

 for(int i=0;i<N;i++)

  sumCheck+=i;

 //

 if(sumA==sumCheck)cout<<"Test Succeeded!"<<endl;

 else

 {

  cerr<<"Test Failed!"<<endl;

  return(1);

 }

 getchar();

 return (0);

}

3.仅对数据填充改为Runtime API 程序

//使用cuda Runtime API完成向数组中填充连续整数
#include<iostream>

using namespace std;

#include<thrust\/reduce.h>

#include<thrust/sequence.h>

#include<thrust/host_vector.h>

#include<thrust/device_vector.h>

__global__ void fillKernel(int *a,int n)

{

 int tid=blockIdx.x*blockDim.x+threadIdx.x;

 if(tid<n) a[tid]=tid;

}

void fill(int *d_a,int n)

{

 int nThreadsPerBlock=512;

 //int nBlocks=n/nThreadsPerBlock+(n%nThreadsPerBlock)?1:0);

 int nBlocks=(n+nThreadsPerBlock)/nThreadsPerBlock;

 fillKernel<<<nBlocks,nThreadsPerBlock>>>(d_a,n);

}

int main()

{

 const int N=50000;

 //任务1:创建数组
 thrust::device_vector<int>a(N);

 //任务2:填充数组,使用Runtime API 填充数组
 fill(thrust::raw_pointer_cast(&a[0]),N);

 //任务3:计算数组元素之和,并行计算
 int sumA=thrust::reduce(a.begin(),a.end(),0);

 //任务4:计算0-N-1之和
 int sumCheck=0;

 for(int i=0;i<N;i++)

  sumCheck+=i;

 //任务5:检查结果的正确性
 if(sumA==sumCheck)cout<<"Test Succeeded!"<<endl;

 else

 {

  cerr<<"Test Failed!"<<endl;

  return(1);

 }

 getchar();

 return (0);

}

【CUDA开发】Cuda C++ Thrust API与 Cuda Runtime API程序比较的更多相关文章

  1. 【CUDA开发】CUDA面内存拷贝用法总结

    [CUDA开发]CUDA面内存拷贝用法总结 标签(空格分隔): [CUDA开发] 主要是在调试CUDA硬解码并用D3D9或者D3D11显示的时候遇到了一些代码,如下所示: CUdeviceptr g_ ...

  2. 【并行计算-CUDA开发】【视频开发】ffmpeg Nvidia硬件加速总结

    2017年5月25日 0. 概述 FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用.Video Codec SDK包含完整的的高性 ...

  3. 【ARM-Linux开发】【CUDA开发】【深度学习与神经网络】Jetson Tx2安装相关之三

    JetPack(Jetson SDK)是一个按需的一体化软件包,捆绑了NVIDIA®Jetson嵌入式平台的开发人员软件.JetPack 3.0包括对Jetson TX2 , Jetson TX1和J ...

  4. 【CUDA开发】CUDA编程接口(一)------一十八般武器

    子曰:工欲善其事,必先利其器.我们要把显卡作为通用并行处理器来做并行算法处理,就得知道CUDA给我提供了什么样的接口,就得了解CUDA作为通用高性能计算平台上的一十八般武器.(如果你想自己开发驱动,自 ...

  5. 【并行计算与CUDA开发】英伟达硬件加速编解码

    硬件加速 并行计算 OpenCL OpenCL API VS SDK 英伟达硬件编解码方案 基于 OpenCL 的 API 自己写一个编解码器 使用 SDK 中的编解码接口 使用编码器对于 OpenC ...

  6. 【CUDA开发】CUDA从入门到精通

    CUDA从入门到精通(零):写在前面 在老板的要求下,本博主从2012年上高性能计算课程开始接触CUDA编程,随后将该技术应用到了实际项目中,使处理程序加速超过1K,可见基于图形显示器的并行计算对于追 ...

  7. 关于CUDA两种API:Runtime API 和 Driver API

                 CUDA 眼下有两种不同的 API:Runtime API 和 Driver API,两种 API 各有其适用的范围. 高级API(cuda_runtime.h)是一种C++ ...

  8. Windows平台CUDA开发之前的准备工作

    CUDA是NVIDIA的GPU开发工具,眼下在大规模并行计算领域有着广泛应用. windows平台上面的CUDA开发之前.最好去NVIDIA官网查看说明,然后下载对应的driver. ToolKits ...

  9. 【神经网络与深度学习】【CUDA开发】caffe-windows win32下的编译尝试

    [神经网络与深度学习][CUDA开发]caffe-windows win32下的编译尝试 标签:[神经网络与深度学习] [CUDA开发] 主要是在开发Qt的应用程序时,需要的是有一个使用的库文件也只是 ...

随机推荐

  1. Linux通过秘钥远程连接

    1. 秘钥生成命令 ssh-keygen 执行完上述的命令就会在root目录下生成公钥跟私钥文件 /root/.ssh/.id_rsa   私钥 /root/.ssh/.id_rsa.pub   公钥 ...

  2. js获取服务器端时间

    第一种: $.ajax({ type:"OPTIONS", url:"/", complete:function(x){ var date = x.getRes ...

  3. Ubuntu:电源管理

    本文适用于Ubuntu 16.04,造冰箱的大熊猫@cnblogs 2018/3/4 在Ubuntu 16.04中,与电源管理相关的选项位于System Settings下的Power对话框中. 要启 ...

  4. 7.Java Web的数据库操作

    一.环境配置(基于MySQL数据库) 1.下载MySQL数据库 2.下载安装 Navicat,破解方法去吾爱破解网站查询 第一次连接mysql时可能会出现错误,可能是因为二者对密码的编码方法不一致,可 ...

  5. 洛谷 P1135 奇怪的电梯 (dfs)

    题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开 ...

  6. 灰度图像--频域滤波 傅里叶变换之连续信号傅里叶变换(FT)

    学习DIP第20天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...

  7. 顺序表应用2:多余元素删除之建表算法(SDUT 3325)

    题解: 每次询问一遍,如果已经存在就不用插入表中了. #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  8. jQuery动画之停止动画

    语法格式: $(selector).stop(true, false); 第一个参数: + ture: 后续动画不执行 false:后续动画会执行 第二个参数: true: 立即执行完成当前动画 fa ...

  9. Java项目框架搭建系列(Java学习路线)

    前言: 已经工作4年,真是时间飞逝. 其实当你在一间公司工作一两年之后,公司用到的开发框架的基本使用你应该都会了. 你会根据一个现有项目A复制一下搭建出另外一个类似框架的项目B,然后在项目B上进行业务 ...

  10. 尚学堂requireJs课程---3、私有和公有属性和方法

    尚学堂requireJs课程---3.私有和公有属性和方法 一.总结 一句话总结: 在 [模块] 的基础上,在return对象里面的方法和属性就是公有的(因为外部可以访问),不在的就是私有的 < ...