gpu程序的一般步骤

  1. CPU分配空间给GPU(cudaMalloc)
  2. CPU复制数据给GPU(cudaMemcpy)
  3. CPU加载kernels给GPU做计算(Kernel核: 可以理解为C/C++中的一个函数function)
  4. CPU把GPU计算结果复制回来

过程中,一般要尽量降低数据通讯的消耗,所以如果程序需要复制大量的数据到GPU,显然不是很合适使用GPU运算,最理想的情况是,每次复制的数据很小,然后运算量很大,输出的结果还是很小,复制回CPU。

先做一个小demo,对一个8位数组求平方,很简单
global 关键字那个函数就是在GPU上运行,我们先写完kernel,那还需要从cpu拿数据过去也就是上面的1和2 这里我们为了区分cpu和gpu变量,用h_表示cpu变量(host),用d_表示gpu变量(device),host和device我们在之前的概论提了这里就不解释了。

#include <stdio.h>//这个就是kernel
__global__ void square(float* d_out,float* d_in){int idx = threadIdx.x;float f = d_in[idx];d_out[idx] = f * f;
}int main(int argc,char** argv){const int ARRAY_SIZE = 8;const int ARRAY_BYTES = ARRAY_SIZE * sizeof(float);// 在cpu中定义要输入的数组float h_in[ARRAY_SIZE];for(int i=0;i<ARRAY_SIZE;i++){h_in[i] = float(i);}float h_out[ARRAY_SIZE];// 声明gpu指针float* d_in;float* d_out;// 对应1步骤,给gpu指针分配内存空间,和cpu上的数据空间一样大cudaMalloc((void**) &d_in,ARRAY_BYTES);cudaMalloc((void**) &d_out,ARRAY_BYTES);// 对应步骤2,把cpu数据复制给gpucudaMemcpy(d_in,h_in,ARRAY_BYTES,cudaMemcpyHostToDevice);// 对应步骤3,把kernel也就是square,加载到gpu上运行,1是一个线程块,其中有64个线程,1个时钟周期就可以结束运算square<<<1,ARRAY_SIZE>>>(d_out,d_in);// 对应步骤4,把gpu数据复制给cpucudaMemcpy(h_out,d_out,ARRAY_BYTES,cudaMemcpyDeviceToHost);// 输入结果for(int i=0;i<ARRAY_SIZE;i++){printf("%f",h_out[i]);printf(((i%4) != 3) ? "\t" : "\n");}// 释放内存cudaFree(d_in);cudaFree(d_out);return 0;}

那我们运行一下看看,先编译,cuda 程序后缀是.cu

nvcc -o square square.cu

square就是我们刚编译出来的程序

运行一下看看
结果就是0-7的平方,正确

cuda编程与gpu并行计算(三):一个小demo了解cuda基本语法相关推荐

  1. cuda编程与gpu并行计算(六):图稀疏矩阵转为CSR结构并传入gpu

    虽然sepgraph有这部分代码,还是自己先试着实现一下,这样读起来也方便 行压缩格式Compressed Sparse Row (CSR) CSR需要三种数据来表达:数值.列号.行转移.CSR不是三 ...

  2. CUDA编程学习3——并行计算初窥CUDA的软硬件架构

    目录 并行计算概述 查看GPU相关信息 软硬件架构基础 物理层(物理结构) 逻辑层(kernel组织) 物理层和逻辑层的总结 参考 并行计算概述 所谓并行计算的概念定义 同时多个计算资源一起工作(逻辑 ...

  3. CUDA编程: GPU与CPU之间使用全局统一内存的完整代码及编译

    CUDA编程: GPU与CPU之间使用全局统一内存的完整代码及编译 最近碰到一个应用场景,需要从GPU访问host上创建的,一个很大的布隆过滤器(准确说是改进后的布谷鸟过滤器).由于GPU卡上的显存有 ...

  4. java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  5. springboot mybatis easyui 整合的一个小demo

    springboot mybatis easyui 整合的一个小demo 这是最终完成界面 话不多说 开整! 这是项目结构 数据库 表结构和数据库 (有点乱 之前本来是个正经图书表的 = =.) /* ...

  6. java线程间通信_java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  7. windows环境下使用clion引入eigen库并实现一个小demo

    本文仅作个人记录用,之前未接触过C++,也没有使用过clion和cmake,不喜勿喷. 首先下载clion,mingw并配置相关环境,安装cmake,这部分比较简单,没有遇到什么问题. 接下来新建一个 ...

  8. cuda编程以及GPU基本知识

    目录 CPU与GPU的基本知识 CPU特点 GPU特点 GPU vs. CPU 什么样的问题适合GPU? GPU编程 CUDA编程并行计算的整体流程 CUDA编程术语:硬件 CUDA编程术语:内存模型 ...

  9. cuda编程python接口_CUDA共享内存问题(以及将CUDA与python / ctypes一...

    (请注意,此答案中的代码还提供了有关如何在与使用python ctypes的python应用程序共享的库中使用CUDA代码(例如CUDA设备内核)的完整秘诀/示例.如果您希望使用CUDA库功能,答案h ...

最新文章

  1. 【网络流24题】解题报告:C、最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)
  2. JFrame 简单使用
  3. Banner 自动无限轮播(普通)
  4. 如何理解c和c ++的复杂类型声明 (转)
  5. 决策树ID3和C4.5算法Python实现源码
  6. Heap与Stack的区别- -
  7. c语言自动计算时间,C语言 · 计算时间
  8. markdown备忘
  9. 职场真实故事计划##职场干货# 职场晋升之路
  10. python---用python实现插入排序
  11. 淘宝京东鞋服板砖线报,秒杀抢购捡漏,兔子仙女宝妈童话镇等之后的寄件价格问题,这个可以帮你sheng下好多快递q,【云杰智慧邀请码:HJDNA5】
  12. chrome open axure 自动跳转到axure插件
  13. Unity 接入有道智云AI - 图片翻译
  14. 智能服务器升级中,全面智能升级! 宁畅G40服务器释放强大算力
  15. 电脑网页服务器拒绝连接失败,电脑服务器拒绝了连接怎么回事
  16. Netty框架之Selector轮询器
  17. 关于typedef,指针数组和数组指针,指针函数的说明
  18. 织梦dedecms 采集笔记
  19. ubuntu设置pac代理
  20. TKO 6-3 DP入门之肥胖的力量

热门文章

  1. Prometheus监控系列-- 进阶阶段 | 高级操作 | 配合Grafana | 邮箱报警 | 参数说明
  2. 51单片机 ADC0809模数转换与显示+Proteus仿真
  3. 微型计算机原理与接口技术ppt,单片机原理与接口技术课件ppt
  4. 基准价搭档“货比三家” 8thManage轻松节省采购成本
  5. vscode跳转不到函数定义
  6. Eye tracker accuracy and precision
  7. Excel空白行如何批量填充复制上一行的内容?
  8. autoit 下载图片验证码
  9. 物联网毕设 -- 智能花盆系统(蓝牙+APP)
  10. ReactNative工程自定义脚本