重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章给大家分享的是有关Ubuntu 9.04下如何实现CUDA编程的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
成都创新互联公司-专业网站定制、快速模板网站建设、高性价比兴安盟乌兰浩特网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式兴安盟乌兰浩特网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖兴安盟乌兰浩特地区。费用合理售后完善,10余年实体公司更值得信赖。
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
2 #include
3 #include
4 #include
5 #include
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;i
28 {
29 h_A[i]=1.0;
30 h_B[i]=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<<<1,dimblock>>>(d_A,d_B,d_C);
49
50 //讲计算结果复制回主存中
51 cudaMemcpy(h_C,d_C,size,cudaMemcpyDeviceToHost);
52
53 //输出计算结果
54 for (int j=0;j
55 {
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 }
感谢各位的阅读!关于“Ubuntu 9.04下如何实现CUDA编程”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!