【CUDA开发】Cuda C++ Thrust API与 Cuda Runtime API程序比较
今天买了本新书《高性能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程序比较的更多相关文章
- 【CUDA开发】CUDA面内存拷贝用法总结
[CUDA开发]CUDA面内存拷贝用法总结 标签(空格分隔): [CUDA开发] 主要是在调试CUDA硬解码并用D3D9或者D3D11显示的时候遇到了一些代码,如下所示: CUdeviceptr g_ ...
- 【并行计算-CUDA开发】【视频开发】ffmpeg Nvidia硬件加速总结
2017年5月25日 0. 概述 FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用.Video Codec SDK包含完整的的高性 ...
- 【ARM-Linux开发】【CUDA开发】【深度学习与神经网络】Jetson Tx2安装相关之三
JetPack(Jetson SDK)是一个按需的一体化软件包,捆绑了NVIDIA®Jetson嵌入式平台的开发人员软件.JetPack 3.0包括对Jetson TX2 , Jetson TX1和J ...
- 【CUDA开发】CUDA编程接口(一)------一十八般武器
子曰:工欲善其事,必先利其器.我们要把显卡作为通用并行处理器来做并行算法处理,就得知道CUDA给我提供了什么样的接口,就得了解CUDA作为通用高性能计算平台上的一十八般武器.(如果你想自己开发驱动,自 ...
- 【并行计算与CUDA开发】英伟达硬件加速编解码
硬件加速 并行计算 OpenCL OpenCL API VS SDK 英伟达硬件编解码方案 基于 OpenCL 的 API 自己写一个编解码器 使用 SDK 中的编解码接口 使用编码器对于 OpenC ...
- 【CUDA开发】CUDA从入门到精通
CUDA从入门到精通(零):写在前面 在老板的要求下,本博主从2012年上高性能计算课程开始接触CUDA编程,随后将该技术应用到了实际项目中,使处理程序加速超过1K,可见基于图形显示器的并行计算对于追 ...
- 关于CUDA两种API:Runtime API 和 Driver API
CUDA 眼下有两种不同的 API:Runtime API 和 Driver API,两种 API 各有其适用的范围. 高级API(cuda_runtime.h)是一种C++ ...
- Windows平台CUDA开发之前的准备工作
CUDA是NVIDIA的GPU开发工具,眼下在大规模并行计算领域有着广泛应用. windows平台上面的CUDA开发之前.最好去NVIDIA官网查看说明,然后下载对应的driver. ToolKits ...
- 【神经网络与深度学习】【CUDA开发】caffe-windows win32下的编译尝试
[神经网络与深度学习][CUDA开发]caffe-windows win32下的编译尝试 标签:[神经网络与深度学习] [CUDA开发] 主要是在开发Qt的应用程序时,需要的是有一个使用的库文件也只是 ...
随机推荐
- k8s 1.16.3 yaml声明变化
apiVersion: apps/v1 #变化的 kind: Deployment metadata: name: taint labels: app: taint spec: replicas: 3 ...
- Acwing-204-表达整数的奇怪方式(扩展中国剩余定理)
链接: https://www.acwing.com/problem/content/206/ 题意: 给定2n个整数a1,a2,-,an和m1,m2,-,mn,求一个最小的非负整数x,满足∀i∈[1 ...
- VUE: 移动端长按弹出确认删除地址(后面测试发现IOS有BUG,后面有更新随笔,更新后的亲测有效)
收货地址的删除方式可能有很多种,我目前见过的暂时只有两种(1.在编辑页删除 2.长按某一条收货地址弹出是否删除地址) 在开发的项目上要求第二种删除方法,于是记录一下我写的代码 ~ 1.首先,在移动端 ...
- .Net面向对象(OOP)
序言 virtual虚方法 virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的 ...
- pdf缩略图上传控件
一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...
- [SCOI2009]windy数 代码 (对应数位dp入门)
Code1 (DP版) #include<bits/stdc++.h> #define in(i) (i=read()) using namespace std; int read() { ...
- 流程控制(判断if switch)
判断语句 判断条件比特别多大 时候用switch 其他时候if语句比较方便 1.if……else a) if(判断条件) {执行语句:} b) else if (判断语句){执行语句:} ...
- $\LaTeX$数学公式大全7
$7\ Arrow\ Symbols$ $\leftarrow$ \leftarrow $\Leftarrow$ \Leftarrow $\rightarrow$ \rightarrow $\Righ ...
- 「CF525D」Arthur and Walls
题目链接 戳我 \(Solution\) 如果一个#要更改,那么一个四个格子的正方形只有他一个是#,bfs弄一下就好了 \(Code\) #include<bits/stdc++.h> u ...
- Partial Dependence Plot
Partial Dependence就是用来解释某个特征和目标值y的关系的,一般是通过画出Partial Dependence Plot(PDP)来体现. PDP是依赖于模型本身的,所以我们需要先训练 ...