博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第一个CUDA程序
阅读量:5226 次
发布时间:2019-06-14

本文共 1643 字,大约阅读时间需要 5 分钟。

CUDA是NVIDIA公司开发的一个用于GPU编程的开源框架,用于将GPU用于更广泛的数学计算,充当cpu的功能,所以只能在nvidia的GPU下实现,如果你的GPU不是nvidia的,赶紧去换一个吧,ATI也有一个类似的框架,叫做streaming,不过要用汇编写。CUDA只需拥有C语音功底就够了。

CUDA C只是C语言的扩展,多了一些包,只要安装好CUDA工具箱(编译GPU代码的编译器)就可以在VS等IDE下就能编译和运行。

下载GPU驱动程序 (可能你的机器已经装好)

下载CUDA工具箱 

还可以下载GPU Computing SDK代码集,也是一个很好的学习资源。

CUDA程序可以分为两部分:GPU执行的代码和CPU执行的代码,两者可以互不干扰,可以通过cudaMemcpy()函数把GPU的相应内存块复制到主存的相应位置,或者相反过程,实现GPU和CPU的数据交互。CPU的内存叫做主存,GPU的里面也有内存,可以叫他设备内存。

 

由于GPU是为图形设计的,具有强大的3维渲染等技术,所以对于多维数组的计算是有强大的能力的。

GPU可以像CPU一样进行计算工作,同样具备多线程,并且线程还是多维线程,计算能力超强,而且可以与CPU的计算一起相互协作,从而实现多核CPU计算的效果。

 

一个简单的传递参数给GPU计算的代码:

 

[cpp] 
 
  1. #include <stdio.h>  
  2. #include "../common/book.h"  
  3.   
  4. __global__ void add(int a,int b,int *c)//__global__声明的函数,告诉编译器这段代码交由GPU执行  
  5. {  
  6.     *c=a+b;  
  7. }  
  8.   
  9. int main(void)  
  10. {  
  11.     int c;  
  12.     int *dev_c;  
  13.     HANDLE_ERROR(cudaMalloc( (void**)&dev_c,sizeof(int) ) );//cudaMalloc()函数让GPU分配内存给某个指针  
  14.       
  15.     add<<<1,1>>>(2, 7, dev_c);//让GPU启动一个线程来运行add()函数,函数的变量必须是保持在GPU上的  
  16.   
  17.     HANDLE_ERROR(cudaMemcpy(&c,dev_c,sizeof(int),cudaMemcpyDeviceToHost) );//将GPU的某块内存复制回CPU  
  18.     printf("2 + 7 = %d\n",c);  
  19.     cudaFree(dev_c);//释放GPU内存  
  20.   
  21.     return 0 ;  
  22. };  

 

[cpp] 
 
    1. <pre name="code" class="cpp"><pre></pre>  
    2. <pre></pre>  
    3. <p> HANDLE_ERROR()是我们定义的宏。判断是否返回了一个错误值。</p>  
    4. <p>一定不能在主机代码中对设备指针进行解引用,主机代码可以将这个指针作为参数传递,对其执行算术运算,甚至可以将其转换为另外一种不同的类型,但是绝对不能使用这个指针来读取或者写入内存。</p>  
    5. <p>设备指针的使用限制:</p>  
    6. <p>1,可以将cudaMalloc()分配的指针传递给在设备上执行的函数。</p>  
    7. <p>2,可以将设备代码中使用cudaMalloc()分配的指针进行内存读、写操作。</p>  
    8. <p>3,可以将cudaMalloc()分配的指针传递给在主机上执行的函数。</p>  
    9. <p>4,不能在主机代码中使用cudaMalloc()分配的指针进行内存读、写操作。</p>  
    10. <pre></pre>  
    11. <pre></pre>  
    12. <pre></pre>  
    13.       
    14.         <div style="padding-top:20px">           
    15.             <p style="font-size:12px;">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>  
    16.         </div>  
    17. </pre>  

转载于:https://www.cnblogs.com/honeybusybee/p/4926033.html

你可能感兴趣的文章
linux查看端口占用
查看>>
Sql常见面试题 受用了
查看>>
知识不是来炫耀的,而是来分享的-----现在的人们却…似乎开始变味了…
查看>>
CSS背景颜色、背景图片、平铺、定位、固定
查看>>
口胡:[HNOI2011]数学作业
查看>>
我的第一个python web开发框架(29)——定制ORM(五)
查看>>
中国剩余定理
查看>>
基础笔记一
查看>>
uva 10137 The trip
查看>>
Count Numbers
查看>>
编写高质量代码改善C#程序的157个建议——建议110:用类来代替enum
查看>>
网卡bond技术
查看>>
UITabbarController的UITabbarItem(例:"我的")点击时,判断是否登录
查看>>
UNIX基础知识之输入和输出
查看>>
【洛谷 P1666】 前缀单词 (Trie)
查看>>
数据库锁机制及乐观锁,悲观锁的并发控制
查看>>
图像处理中双线性插值
查看>>
RobHess的SIFT代码解析之RANSAC
查看>>
03 线程池
查看>>
201771010125王瑜《面向对象程序设计(Java)》第十三周学习总结
查看>>