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

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

下载GPU驱动程序 www.nvidia.com/cuda(可能你的机器已经装好)

下载CUDA工具箱 http://developer.nvidia.com/object/gpucomputing.html

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

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

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

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

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

[cpp] view plaincopy

print?

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

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

print?

  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. </pre>

[cpp] view plaincopy

print?

  1. <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.      



 HANDLE_ERROR()是我们定义的宏。判断是否返回了一个错误值。
一定不能在主机代码中对设备指针进行解引用,主机代码可以将这个指针作为参数传递,对其执行算术运算,甚至可以将其转换为另外一种不同的类型,但是绝对不能使用这个指针来读取或者写入内存。
设备指针的使用限制:
1,可以将cudaMalloc()分配的指针传递给在设备上执行的函数。
2,可以将设备代码中使用cudaMalloc()分配的指针进行内存读、写操作。
3,可以将cudaMalloc()分配的指针传递给在主机上执行的函数。
4,不能在主机代码中使用cudaMalloc()分配的指针进行内存读、写操作。





cude之helloworld相关推荐

  1. Docker安装Apache与运行简单的web服务——httpd helloworld

    Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...

  2. CentOS Docker安装配置部署Golang web helloworld

    目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker部署Golang web helloworld 四.Docker与虚拟机的区别 五. ...

  3. 简单图文配置golang+vscode【win10/centos7+golang helloworld+解决install failed等情况】

    博客目录(阅读时间:10分钟) 一.win10 0.系统环境 1. win10配置golang环境 ①下载相关软件 ②创建gowork工作空间 ③配置环境变量(GOPATH+PATH) ④验证环境配置 ...

  4. idea java jni 调试_IntelliJ IDEA平台下JNI编程(一)—HelloWorld篇

    JNI(Java Native Interface),出于学习JNI的目的,为了能够更方便快速地运行程序.本文的是在IDEA中进行,而不在AndroidStudio,这样能够对NDK的工作过程有个更深 ...

  5. Apache模块开发helloworld无错版

    环境:CentOS 5.4 第一步:安装Apache的apxs 首先来介绍下apache的一个工具apxs.apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程 ...

  6. 1.1GTK+ 的简单程序HelloWorld

    1.1GTK+ 的简单程序HelloWorld 编译执行如图所看到的:

  7. 项目构建之maven篇:2.HelloWorld项目构建过程

    文件结构说明: 项目构建生命周期: 清理 编译 測试 打包 执行 部署 清理与编译 hello\pom.xml POM:Project Object Model,项目对象模型 pom.xml与ant的 ...

  8. Python基础01-Python环境搭建与HelloWorld

    目录 从今天开始学习Python Python环境搭建 安装gcc Python源码包安装 开始Python第一个代码HelloWorld! 从今天开始学习Python 为啥选择Python,可能是跟 ...

  9. 从HelloWorld看Knative Serving代码实现

    为什么80%的码农都做不了架构师?>>>    摘要: Knative Serving以Kubernetes和Istio为基础,支持无服务器应用程序和函数的部署并提供服务.我们从部署 ...

  10. flask源码学习-helloworld与本地启动流程

    Flask源码分析 本文环境python3.5.2,flask-1.0.2. Flask的初探 首先,在项目文件夹下建立flask_run.py文件,然后写入如下, from flask import ...

最新文章

  1. Linux环境HBase安装配置及使用
  2. 腾讯以及各大厂的 C++ 开发环境是什么样的?
  3. java int interger_java面试题之int和Integer的区别
  4. 我居然从一只猫身上学到了斐波那契数列
  5. Hibernate事实:集成测试策略
  6. Analyzing Storage Performance using the Windows Performance Analysis ToolKit (WPT)
  7. 报错,npm ERR! code ENOLOCAL
  8. GCF(1)---How to modify PICS according to FGI bits UE reported
  9. MAC安装chromedriver碰到的问题:mv: rename chromedriver to /usr/bin/chromedriver: Operation not permitted
  10. php swoole 游戏框架,Swoole 高性能php框架
  11. (转)C# 解析 json
  12. 迁移 Linux 系统,第 1 部分——如何迁移备份和裸机恢复 Linux 系统
  13. 【模版】求单个/多个欧拉函数值
  14. android 拼音过滤、匹配首字母
  15. 网页设计 颜色搭配
  16. Xilinx FPGA bit文件和MCS下载流程
  17. 【敏捷】敏捷时代的建模:敏捷团队的扩张除了代码还需要什么? (ZZ)
  18. [矩阵计算]Lanczos方法:求稀疏矩阵特征值
  19. java scanner 教程,Java Scanner 类 - Java 入门教程
  20. 实战:Traefik 高级配置2-2022.1.18

热门文章

  1. PS如何快速修改证件照片底色
  2. java 树什么意思是什么意思是什么_Java数据结构和算法 - 什么是2-3-4树
  3. day12 三大神器
  4. 各大学习平台资源整合【网站篇一】
  5. 基于 FPGA 的 UART 控制器设计(VHDL)(中)
  6. NPS - 数字化营销 - 净推荐值
  7. C++ fstream详解
  8. JAVA面试技巧之自我介绍
  9. 曼哈顿距离与切比雪夫距离的亲密♂关系。
  10. 3656. 心与心的距离