我的第一个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\ ...
随机推荐
- HDFS的体系结构和操作
1.对hdfs操作的命令格式是hadoop fs 1.1 -ls <path> 表示对hdfs下一级目录的查看 1.2 -lsr <path> 表示对hdfs目录的递归查看 1 ...
- hadoop2的伪分布部署
通过我们前面的操作,已经可以编译并且打包产生适合本机的hadoop包,目录是/usr/local/hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.2.0. 使 ...
- 在Java中直接调用js代码
JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: “alert ...
- 【Android】 PopupWindow使用小结
PopupWindow的很多用法网上比较多,我就不做过多解释了,只说下可能会遇到的问题,以及解决办法: 1.PopupWindow中的listview无响应 这个主要是因为show写在了set ...
- core--作业
线程被封装在进程中,进程能不能被封装? 当有多个进程协调一起来完成一项任务的时候,就使用"作业"来完成 作业将进程组合在一起,并创建一个"盒子"来限制进程能够做 ...
- window.location.href 放置在单独的JS文件中使用时问题
场景:假设当前浏览器地址栏的地址是:http://localhost:8888/SSHBoot/tourist/homeMainAction_signInUI.do, 现在我想在点击按钮时定位到“ht ...
- PHP学习笔记02——简易计算器
<!DOCTYPE html> <html> <head> <title>PHP简易计算器</title> </head> &l ...
- android中handler用法总结
一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中 ...
- Matlab---size,length和numel函数的用法
size:获取数组的行数和列数 length:数组长度(即行数或列数中的较大值) numel:元素总数. 1.size()函数 s=size(A),当只有一个输出参数时,返回一个行向量,该行向量的第一 ...
- XE7 - 程序图标及启动画面图片的注意事项
还是继续昨晚写的,年前已经解决了这个问题,现在补记下.启动画面失真是本篇笔记的重点.搜索了很多文章,基本上大同小异,几乎都没怎么提及启动画面失真的问题.不知道是不是我的操作不对头,. Project ...