首页 > 编程语言 >从头开始进行CUDA编程:线程间协作的常见技术

从头开始进行CUDA编程:线程间协作的常见技术

时间:2022-11-13 11:11:09浏览次数:62  
标签:从头开始 并行 算法 线程 CUDA 数组 array 我们

在前一篇文章中,我们介绍了如何使用 GPU 运行的并行算法。这些并行任务是那些完全相互独立的任务,这点与我们一般认识的编程方式有很大的不同,虽然我们可以从并行中受益,但是这种奇葩的并行运行方式对于我们来说肯定感到非常的复杂。所以在本篇文章的Numba代码中,我们将介绍一些允许线程在计算中协作的常见技术。

 

线程间的协作

简单的并行归约算法

我们将从一个非常简单的问题开始本节:对数组的所有元素求和。这个算法非常简单。如果不使用NumPy,我们可以这样实现它:

  1. def sum_cpu(array):
  2. s = 0.0
  3. for i in range(array.size):
  4. s += array[i]
  5. return s

这看起来不是很 Pythonic。但它能够让我们了解它正在跟踪数组中的所有元素。如果 s 的结果依赖于数组的每个元素,我们如何并行化这个算法呢?首先,我们需要重写算法以允许并行化, 如果有无法并行化的部分则应该允许线程相互通信。

到目前为止,我们还没有学会如何让线程相互通信……事实上,我们之前说过不同块中的线程不通信。我们可以考虑只启动一个块,但是我们上次也说了,在大多数 GPU 中块只能有 1024 个线程!

如何克服这一点?如果将数组拆分为 1024 个块(或适当数量的threads_per_block)并分别对每个块求和呢?然后最后,我们可以将每个块的总和的结果相加。下图显示了一个非常简单的 2 块拆分示例。

上图就是对数组元素求和的“分而治之”方法。

完整文章:

https://avoid.overfit.cn/post/644465cc7a31427c88d1378728aa876c

标签:从头开始,并行,算法,线程,CUDA,数组,array,我们
From: https://www.cnblogs.com/deephub/p/16885613.html

相关文章

  • 读者-写者(多线程)
    读者-写者(多线程)描述问题:需满足的条件:1.写进程与写进程之间必须互斥的写入数据(因为如果两个写进程同时对共享数据中的区域A中的数据进行写操作的话,会导致数据错误覆盖......
  • 线程安全和可重入
    1. 结论(牢记):     可重入一定线程安全!!          2. 详解/****************************************************/1.可重入可以......
  • 实现线程安全的方法三
    Lock锁实例化ReentrantlockprivateReentrantlocklock=new Reentrantlock(); publicvoidrun(){whilie(true){try{lock.lock()......
  • Linux系统中线程同步方式中的条件变量操作方法
      大家好,今天主要和大家聊一聊,如何使用Linux中线程同步方式中的条件变量。    第一:条件变量基本简介   条件变量是线程可用的另一种同步机制,条件变量用于自动阻......
  • WPF 后台线程操作界面元素不卡UI界面线程 Dispatcher
    经常要考虑的,后台的耗时操作不要卡死主界面的问题。<StackPanelVerticalAlignment="Center"><Labelx:Name="lblHello">欢迎你光临WPF的世界!</Label><Button......
  • 解决线程安全问题二
    packagedeep;//同步方法classWindow3implementsRunnable{privateintticket=100;publicvoidrun(){while(true){show();......
  • 如何解决多线程安全问题一
    packagedeep;//问题:出现重票和错票(即线程安全问题)//原因:某个线程操作车票的过程中,未完成时其它线程就参与进来,也操作//如何解决:a操作完才允许其它线程加入//在java中通过......
  • 线程、 进程、 协程
    1.多线程(单线程、多线程)#线程、进程#线程是执行单位进程->公司线程->员工#进程是资源单位(每一个进程里面至少有一个线程)#单线程deffunc():for......
  • 线程创建
    线程创建继承Thread类方法1.自定义线程继承Thread类2.重写run()方法,编写线程执行体3.创建线程对象,调用start()方法启动线程注意:线程不一定立即执行,CPU安排调度pack......
  • 线程协作(生产者消费者模式)
    线程协作(生产者消费者模式)线程通信1.Java提供了几个方法解决线程之间的通信问题​。wait()表示线程一直等待,直到其他线程通知,与sleep不同,会释放锁​......