我的第一个CUDA程序
最近在学习CUDA框架,折腾了一个多月终于把CUDA安装完毕,现在终于跑通了自己的一个CUDA的Hello world程序,值得欣喜~
首先,关于CUDA的初始化,代码和解释如下,这部分主要参考GXW的文章:
//init the CUDA device
bool initCUDA()
{
int deviceCount;
cudaGetDeviceCount(&deviceCount); //Get the CUDA GPU count
if (deviceCount==0)
{
fprintf(stderr, "There is no device.\n");
return false;
} //判断是否有支持CUDA的装置,如果没有,deviceCount会返回一个1,而device0是一个cuda的仿真装置,而这个仿真的装置是不支持CUDA1.0以上。
//所以在写程序时候需要判断各个装置支持的版本号,只有在版本号大于1.0
int i;
for (i=0;i<deviceCount;i++)
{
cudaDeviceProp prop;
if (cudaGetDeviceProperties(&prop,i)==cudaSuccess)
{
if (prop.major>=1)
{
break;
}
}
} if (i==deviceCount)
{
fprintf(stderr,"There is no device supporting CUDA1.x.\n");
return false;
} cudaSetDevice(i); return true;
}
初始化之后,先说一下程序的总体的思想,在main函数中生命一个字符串“Hello Word!”,然后利用GPU多个线程,分别对这个字符串进行修改。废话不多说,上代码:
__global__ void helloword(char * helloword)
{
int i= threadIdx.x; //得到当前线程的id
helloword[i] = helloword[i]+1;
} int main(int count, char * args[])
{
if (!initCUDA())
{
return 0;
}
printf("CUDA successfully init"); char * cpu_hello="Hello world!";
int size= strlen(cpu_hello); char* gpu_hello;
//为gpu_hello在GPU上面开辟一块空间,cudaMalloc和c里面的函数malloc有些相似,不过cudaMalloc是在GPU上面开辟空间
cudaMalloc((void**)&gpu_hello,size*sizeof(char));
//cudaMemcpy主要用于在cpu和GPU之间拷贝数据,前三个参数和c语言里面的memcpy一样,最后一个指定方向的
cudaMemcpy(gpu_hello,cpu_hello,size*sizeof(char),cudaMemcpyHostToDevice);
helloword <<<1,size>>>(gpu_hello); cudaError_t cudaErr=cudaGetLastError();
if (cudaErr!=cudaSuccess)
{
fprintf(stderr,"addKernel failed!");
return 0;
} cudaErr=cudaDeviceSynchronize();
if (cudaErr!= cudaSuccess)
{
fprintf(stderr,"synchronize is wrong");
return 0;
} char *temp= (char *)malloc(sizeof(char)*(size+1));
memset(temp,0,size+1);
cudaErr =cudaMemcpy(temp,gpu_hello,size*sizeof(char),cudaMemcpyDeviceToHost);
if (cudaErr != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!%s",cudaGetErrorString(cudaErr));
return 0;
}
printf("\n%s\n",temp); return 1;
}
调试了好久,这个程序才调通,对于老手来讲可能不算什么,但是对于我这个新手来讲,喜悦之情……呵呵。
路漫漫其修远兮,吾将上下而求索~
我的第一个CUDA程序的更多相关文章
- 详解第一个CUDA程序kernel.cu
CUDA是一个基于NVIDIA GPU的并行计算平台和编程模型,通过调用CUDA提供的API,可以开发高性能的并行程序.CUDA安装好之后,会自动配置好VS编译环境,按照UCDA模板新建一个工程&qu ...
- 第一个CUDA程序
开始学CUDA 先写一个简单的 #include<iostream>__global__ void add( int a, int b, int *c ) { *c = a + b;}in ...
- 分享一个CUDA的环境配置属性表,从此不用再担心配置不好CUDA环境了
本文适用: Visual Studio 2008,C++, CUDA版本不限,不过我用的是5.5做的实验. 先贴出属性表的内容: <?xml version="1.0" en ...
- CUDA程序的调试总结【不定时更新】
1 )CUDA的程序,经常犯,但是很难发现的一个错误就是同步问题. 描述下实例 for (k = 0; k < N; k+=BS) { sda[tx] = gda[tx+index]; __sy ...
- GPU/CUDA程序初体验 向量加法
现在主要的并行计算设备有两种发展趋势: (1)多核CPU. 双核,四核,八核,...,72核,...,可以使用OpenMP编译处理方案,就是指导编译器编译为多核并行执行. (2)多线程设备(GP)GP ...
- GPU编程自学3 —— CUDA程序初探
深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...
- CUDA程序计时
之前写的CUDA程序,想测量一下性能,网上很多用的是CPU端计时,很不准确.翻了一下书,发现这里应该使用事件来计时. CUDA中的事件本质上是一个GPU时间戳,这个时间戳是在用户指定的时间点上记录的. ...
- GPU 编程入门到精通(三)之 第一个 GPU 程序
博主因为工作其中的须要.開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...
- DirectX游戏编程(一):创建一个Direct3D程序
一.环境 Visual Studio 2012,DirectX SDK (June 2010) 二.准备 1.环境变量(如没有配置请添加) 变量名:DXSDK_DIR 变量值:D:\Software\ ...
随机推荐
- Machine Learning for hackers读书笔记(九)MDS:可视化地研究参议员相似性
library('foreign') library('ggplot2') data.dir <- file.path('G:\\dataguru\\ML_for_Hackers\\ML_for ...
- [原创] - C#编程大幅提高OUTLOOK的邮件搜索能力!
使用OUTLOOK, 你有没有遇到过上图的问题? 多达18419封邮件! 太多了, 每次想找一个邮件都非常耗时, 想办法解决这个问题成了一件非常紧迫的事情. 利用MS Search当然可以, 但是它太 ...
- Mysql使用大全
#登录数据库 mysql -hlocalhost -uroot -p; #修改密码 mysqladmin -uroot -pold password new; #显示数据库 show database ...
- python练习程序(c100经典例19)
题目: 一个数如果恰好等于它的因子之和,这个数就称为“完数”.例如6=1+2+3.编程找出1000以内的所有完数. def foo(a): sra=a; lis=[1]; while 1: for i ...
- Android的IPC机制(一)——AIDL的使用
综述 IPC(interprocess communication)是指进程间通信,也就是在两个进程间进行数据交互.不同的操作系统都有他们自己的一套IPC机制.例如在Linux操作系统中可以通过管道. ...
- tar 实现增量备份
使用 tar -g 参数进行增量备份实验 完整备份: #执行完整备份tar -g snapshot -zcf back.tar.gz back #查看 tarball 内容[huzi@mail ~]$ ...
- android webview 遇到的问题:external/chromium/net/disk_cache/stat_hub.cc:216:
今天也遇到这个问题,界面显示无法访问,Baidu吧,结果有些含糊其词,有的说加网络权限,我看了下我的, 有个 <uses-permission android:name="androi ...
- js函数内嵌函数的整体跳出 .
stop=false; $.ajax({success:function(){ 这里面不能用return false跳出整个<script></script>,只能跳出该处的f ...
- ArcEngine下投影坐标和经纬度坐标的相互转换
jojojojo2002 原文 ArcEngine下投影坐标和经纬度坐标的相互转换 投影转经纬度 private IPoint PRJtoGCS( double x, double y) { IPoi ...
- 防范 DDoS 攻击的 15 个方法
为了对抗 DDoS(分布式拒绝服务)攻击,你需要对攻击时发生了什么有一个清楚的理解. 简单来讲,DDoS 攻击可以通过利用服务器上的漏洞,或者消耗服务器上的资源(例如 内存.硬盘等等)来达到目的.DD ...