免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1646 | 回复: 0
打印 上一主题 下一主题

Ubuntu 9.04下CUDA编程起步 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-13 21:37 |只看该作者 |倒序浏览

                                前一阵子把蚁群算法和改进的K-Means算法都搞定了,然后一直在看CUDA编程,前面看CUDA的介绍,一直认为会C之后CUDA就很容易上手,其实不然,还需要了解一些GPU的体系结构相关的知识才能写出好的程序来。《GPU高性能运算之CUDA》这本书看完一遍之后感觉它更像一个手稿整理,把之前的恒多文档整理了一下出了一本书,因为是集大家的智慧,讲的还不错,就是顺序上安排的不是太好。有总比没有好,看过一遍之后,对CUDA编程还是有一些底气的。推荐新手也先看看。
看书归看书,写程序是另外一件事情,上一篇文章里把环境搭建起来了,可是我还是不知道怎么创建CUDA工程,怎么动手开始写程序。还好CUDA提供了一个SDK,里面有很多的实例可以供我们参考,于是乎,我的第一个CUDA程序就从这里开始了。
CUDA SDK的实例都在src目录下,每一个实例都有一个自己的目录,例如deviceuery,在它的目录下还有一个编译时候使用的Makefile文件,这是编译单个项目的。现在我们将所有实例都编译一遍,在CUDA_SDK根目录下运行sudo make之后,可以在 /bin/linux/release下看到编译之后的可执行程序,运行即可看到结果。
这是deviceQuery的运行结果:

那么到这里相信读者应该想到了我们完全可以利用这些实例来创建我们自己的工程。再实例中有一个template,将该目录下src中的.cu、.cpp文件删除,将obj目录下的内容清空,这就成为一个空的CUDA工程,可以再src下编写程序,然后在Makefie中将编译的文件名修改正确,编译即可。所生成的执行文件在CUDA_SDK_HOME/bin/linux/release下。这里是一个测试代码,执行矩阵加法运算的:
1 #include stdio.h>
  2 #include stdlib.h>
  3 #include time.h>
  4 #include cuda_runtime.h>
  5 #include cutil.h>
  6
  7 #define VEC_SIZE 16
  8
  9 //kernel function
10 __global__ void vecAdd(float* d_A,float* d_B,float* d_C)
11 {
12  int index=threadIdx.x;
13         d_C[index]=d_A[index]+d_B[index];
14 }
15
16 int main()
17 {
18 //得到分配空间的大小
19         size_t size=VEC_SIZE*sizeof(float);
20
21         //为本地分配内存
22         float* h_A=(float*)malloc(size);
23         float* h_B=(float*)malloc(size);
24         float* h_C=(float*)malloc(size);
25
26         //初始化
27         for (int i=0;iVEC_SIZE;++i)   
28         {
29                 h_A=1.0;
30                 h_B=2.0;  
31         }
32      
33         //将本地内存的中的数据复制到设备中
34         float* d_A;
35         cudaMalloc((void**)&d_A,size);
36         cudaMemcpy(d_A,h_A,size,cudaMemcpyHostToDevice);
37         
38         float* d_B;
39         cudaMalloc((void**)&d_B,size);
40         cudaMemcpy(d_B,h_B,size,cudaMemcpyHostToDevice);
41
42         //分配存放结果的空间
43         float* d_C;
44         cudaMalloc((void**)&d_C,size);
45
46         //定义16个线程
47         dim3 dimblock(16);
48         vecAdd>>(d_A,d_B,d_C);
49
50         //讲计算结果复制回主存中
51         cudaMemcpy(h_C,d_C,size,cudaMemcpyDeviceToHost);
52
53         //输出计算结果
54         for (int j=0;j55         {
56                printf("%f\t",h_C[j]);
57         }
58
59         //释放主机和设备内存
60         cudaFree(d_A);
61         cudaFree(d_B);
62         cudaFree(d_C);
63
64         free(h_A);
65         free(h_B);
66         free(h_C);
67
68         return 0;
69 }
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104586/showart_2120172.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP