cuda并行计算

  • 多线程的编号
dim3 grid(3,2);
dim3 block(5,3);
kernel_fun<<< grid,block >>> (params...);
int index_x = blockIdx.x * blockDim.x + threadIdx.x;
int index_y = blockIdx.y * blockDim.y + threadIdx.y;
//对应到底下的节点的具体编号计算就是:
index_x = 2 * 5 + 3 = 13;
index_y = 0 * 3 + 1 =1;
最后就是(13,1)这个节点进行线程的运行

在这里插入图片描述

  • 比如thread(1,1)的编号
    在这里插入图片描述
  • 多线程的原子操作
    其余函数操作参考网址
    CUDA的原子操作可以理解为对一个变量进行“读取-修改-写入”这三个操作的一个最小单位的执行过程,这个执行过程不能够再分解为更小的部分,在它执行过程中,不允许其他并行线程对该变量进行读取和写入的操作。基于这个机制,原子操作实现了对在多个线程间共享的变量的互斥保护,确保任何一次对变量的操作的结果的正确性。
  atomicAdd()
  int atomicAdd(int* address, int val);
  unsigned int atomicAdd(unsigned int* address,unsigned int val);
  unsigned long long int atomicAdd(unsigned long long int* address,unsigned long long int val);
读取位于全局或共享存储器中地址address 处的32 位或64 位字old,计算(old + val),并将结果存储在存储器的同一地址中。这三项操作在一次原子事务中执行。该函数将返回old。只有全局存储器支持64 位字。

由于GPU实际上是异构模型,所以需要区分host和device上的代码,在CUDA中是通过函数类型限定词开区别host和device上的函数,主要的三个函数类型限定词如下:

global:在device上执行,从host中调用(一些特定的GPU也可以从device上调用),返回类型必须是void,不支持可变参数参数,不能成为类成员函数。注意用__global__定义的kernel是异步的,这意味着host不会等待kernel执行完就执行下一步。
device:在device上执行,单仅可以从device中调用,不可以和__global__同时用。
host:在host上执行,仅可以从host上调用,一般省略不写,不可以和__global__同时用,但可和__device__,此时函数会在device和host都编译。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. CUDA简介 GPU是图形处理单元(Graphic Processing Unit)的简称,最初主要用于图形渲染。自九十年代开始,GPU的发展产生了较大的变化,NVIDIA、AMD(ATI)等GPU生产商敏锐的观察到GPU天生的并行性,经过他们对硬件和软件的改进,GPU的可编程能力不断提高,GPU通用计算应运而生。由于GPU具有比CPU强大的计算能力,为科学计算的应用提供了新的选择。 最早的GPU的开发直接使用了图形学的API,将任务映射成纹理的渲染过程,使用汇编或者高级着色器语言Cg,HLSL等编写程序,然后通过图形学API执行(Direct3D和OpenGL),这样的开发不仅难度较大,而且难以优化,对开发人员的要求非常高,因此,传统的GPU计算并没有广泛应用。 2007年6月,NVIDIA公司推出了CUDA(Compute Unified Device Architecture),CUDA不需要借助图形学API,而是采用了类C语言进行开发。同时,CUDA采用了统一处理架构,降低了编程的难度,使得NVIDIA相比AMD/ATI后来居上。相比AMD的GPU,NVIDIA GPU引入了片内共享存储器,提高了效率。这两项改进使CUDA架构更加适合进行GPU通用计算。由于这些特性,CUDA推出后迅速发展,被应用于石油勘测、天文计算、流体力学模拟、分子动力学仿真、生物计算、图像处理、音视频编解码等领域。 由于采用的是C/C++编译器为前端,以C/C++语法为基础设计,因此对熟悉C系列语言的程序员来说,CUDA的语法比较容易掌握。CUDA只对ANSI C进行了最小的必要扩展,以实现其关键特性--线程按照两个层次进行组织、共享存储器和栅栏同步。 这些关键特性使得CUDA拥有了两个层次的并行:线程级并行实现的细粒度数据并行,和任务级并行实现的粗粒度并行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值