GPU Parallel Computing

GPU Parallel Computing

 GPU                                                                                                         

  GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。GPU是相对于CPU的一个概念,由于在现代的计算机中(特别是家用系统,游戏的发烧友)图形的处理变得越来越重要,需要一个专门的图形的核心处理器。

  GPU有非常多的厂商都生产,和CPU一样,生产的厂商比较多,但大家熟悉的却只有3个,以至于大家以为GPU只有AMD、NVIDIA、Intel3个生产厂商。

nVidia GPU AMD GPU Intel MIC协处理器 nVidia Tegra 4 AMD ARM服务器

CUDA C/C++

CUDA fortran

OpenCL MIC OpenMP CUDA  

GPU 并行计算                                                                                              

  • 可以同CPU或主机进行协同处理
  • 拥有自己的内存
  • 可以同时开启1000个线程
  • 单精度:4.58TFlops 双精度 1.31TFlops

  GPU编程方面主要有一下方法:

GPU Parallel Computing


 

   采用GPU进行计算时与CPU主要进行以下交互:

  • CPU与GPU之间的数据交换
  • 在GPU上进行数据交换

GPU Parallel Computing


 

GPU编程–CUDA                                                                                       

CUDA C/C++: download CUDA drivers & compilers & samples (All In One Package ) free from:

    http://developer.nvidia.com/cuda/cuda-downloads

选择适合的版本~~~~我的下载的是5.0 notebook版本

具体安装方法:可参考这里http://blog.csdn.net/diyoosjtu/article/details/8454253

安装后,打开VS->新建,就会发现一个nVidia,里面有一个CUDA

  主要过程:

  • Hello World
    •   Basic syntax, compile & run
  • GPU memory management
    •   Malloc/free
    •   memcpy
  • Writing parallel kernels
    •    Threads & block
    •      Memory hierachy
复制代码
//hello_world.c:
#include <stdio.h>

void hello_world_kernel(){
    printf(“Hello World\n”);
}
int main(){    hello_world_kernel();}
Compile
& Run: gcc hello_world.c ./a.out
复制代码

CUDA:

复制代码
//hello_world.cu:
#include <stdio.h>
__global__ void hello_world_kernel(){
    printf(“Hello World\n”);
}

int main(){    hello_world_kernel<<<1,1>>>();}

Compile & Run:
nvcc hello_world.cu
./a.out
复制代码


 

GPU计算的主要过程:

  1. Allocate CPU memory for n integers
  2. Allocate GPU memory for n integers
  3. Initialize GPU memory to 0s
  4. Copy from CPU to GPU
  5. call the __global__function, compute   

    Keyword for CUDA kernel

  6. Copy from GPU to CPU
  7. Print the values
  8. free

主要函数:

复制代码
//Host (CPU) manages device (GPU) memory:
cudaMalloc (void ** pointer, size_t nbytes)
cudaMemset (void * pointer, int value, size_t count)
cudaFree (void* pointer)

int nbytes = 1024*sizeof(int);
int * d_a = 0;
cudaMalloc( (void**)&d_a,  nbytes );
cudaMemset( d_a, 0, nbytes);
cudaFree(d_a);

cudaMemcpy( void *dst,   void *src,   size_t nbytes, enum cudaMemcpyKind direction);
//returns after the copy is complete
/*blocks CPU thread until all bytes have been copied
doesn’t start copying until previous CUDA calls complete
enum cudaMemcpyKind
  cudaMemcpyHostToDevice
  cudaMemcpyDeviceToHost
  cudaMemcpyDeviceToDevice*/
复制代码

其中,<<<grid,block>>>

  • 2-level hierarchy: blocks and grid
    •   Block = a group of up to 1024 threads
    •   Grid = all blocks for a given kernel launch
    •   E.g. total 72 threads
      •      blockDim=12, gridDim=6
  • A block can:
    •   Synchronize their execution
    •   Communicate via shared memory
  • Size of grid and blocks are specified during kernel launch

例子:

GPU Parallel Computing
View Code

Thread index computation : 

  idx = blockIdx.x*blockDim.x + threadIdx.x:


 

应用                                                                                                         

High performance math routines for your applications:

  • cuFFT – Fast Fourier Transforms Library
  • cuBLAS – Complete BLAS Library
  • cuSPARSE – Sparse Matrix Library
  • cuRAND – Random Number Generation (RNG) Library
  • NPP – Performance Primitives for Image & Video Processing
  • Thrust – Templated C++ Parallel Algorithms & Data Structures
  • math.h – C99 floating-point Library
 
 

 

知识共享许可协议
本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109010.html原文链接:https://javaforall.net

(0)
上一篇 2021年9月15日 上午8:00
下一篇 2021年9月15日 上午9:00


相关推荐

  • debian apt-get update报错GPG error

    debian apt-get update报错GPG error查看http://ftp-master.debian.org/查看“Archivesigningkey”,点击download或者wgethttp://ftp-master.debian.org/archive-key-5.0.asc然后apt-keyaddarchive-key-5.0.ascOK也有可能是另一个问题:

    2022年10月9日
    7
  • 海淘联想电脑必备网站(第7通道和第8通道)[通俗易懂]

    海淘联想电脑必备网站(第7通道和第8通道)[通俗易懂]目前已知联想主要打折网如下:1.http://lenovo.com【官方网站】2.http://lenovo.com/epp【联想员工】3.http://lenovo.com/spp【持股人士】4.http://lenovo.com/students【学生】5.http://lenovo.com/familyandfriends【家属及朋友】6.http://ww

    2022年5月10日
    38
  • 设计模式之责任链模式(职责链模式)

    设计模式之责任链模式(职责链模式)前言在现实生活中 一个事件需要经过多个对象处理是很常见的场景 例如 采购审批流程 请假流程等 公司员工请假 可批假的领导有部门负责人 副总经理 总经理等 但每个领导能批准的天数不同 员工必须根据需要请假的天数去找不同的领导签名 也就是说员工必须记住每个领导的姓名 电话和地址等信息 这无疑增加了难度 在计算机软硬件中也有相关例子 如总线网中数据报传送 每台计算机根据目标地址是否同自己的地址相同来决定是否接收 还有异常处理中 处理程序根据异常的类型决定自己是否处理该异常 还有 Struts2 的拦截器 J

    2026年3月18日
    1
  • ASSERT_VALID和ASSERT宏分析[通俗易懂]

    ASSERT_VALID和ASSERT宏分析[通俗易懂]这个宏都是MFC的调试宏. ASSERT_VALID宏用来在运行时检查一个对象的内部合法性,比如说现在有一个学生对象,我们知道每个学生的年龄一定大于零,若年龄小于零,则该学生对象肯定有问题。事实上,ASSERT_VALID宏就是转化为对象的成员函数Asser

    2025年9月22日
    12
  • Gradle安装和配置

    Gradle安装和配置1 下载安装包官网地址 https gradle org releases 直接解压 2 配置环境变量需要有 jdk8 以上的版本添加 GRADLE HOMEpath 下添加 GRADLE HOME bin3 验证是否配置成功 gradle v4 配置阿里云仓库在 gradle 6 8 3 init d 目录下创建 init gradle 文件 touchinit gradlebuilds repositories mave

    2026年3月18日
    2
  • sesvc.exe_alg是什么进程

    sesvc.exe_alg是什么进程今天公司的一台电脑一点右键就没有反应,通过任务管理发现每次启动都会有一个“Excel”进程,第一感觉就是中毒了,在网上找到了无暇解决方案杀毒方法:(切记:在操作过程中使用“右键->打开”,不可双击。)1.结束注册表中的fun.xls.exe的进程(建议选中fun.xls.exe->右键->转到进程,查找到“algsrvs.exe”单击它,再选择“…

    2022年10月3日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号