广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >多核中的并行前缀和计算分析
  • 166
分享到

多核中的并行前缀和计算分析

2024-04-02 19:04:59 166人浏览 安东尼
摘要

本篇内容介绍了“多核中的并行前缀和计算分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、串行前缀和的计

本篇内容介绍了“多核中的并行前缀和计算分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1、串行前缀和的计算

如果给定一个数列a[n],令S[k] = a[0]+a[1]+...+a[k],(k = 0, 1, 2…n-1),数列S[k]即为数列a[n]的前缀和。例如下面一列数据:

a[4] = {1,   2,   3,   4};

其前缀和为

S[0] = a[0] = 1;

S[1] = a[0] + a[1] = 1+ 2 = 3;

S[2] = a[0] + a[1] + a[2] = 1 + 2 + 3 = 6;

S[3] = a[0] + a[1] + a[2] + a[3] = 1 + 2 + 3 + 4 = 10;

前缀和的计算非常简单,一般地,可以用下面的函数来进行串行前缀和的计算:

  template <class T>  void Sequential_PrefixSum(T * pInput, T *pOutput, int nLen)  {      int i;         pOutput[0] = pInput[0];      for ( i = 1; i < nLen; i++ )      {          pOutput[i] = pInput[i] + pOutput[i-1];      }  }

在上面的串行前缀和计算代码中可以看出,每次循环都依赖于上一次循环的结果,因此无法直接对循环进行并行化,要进行并行化则必须修改计算方法,下面就来看如何进行并行前缀和的计算。

2、并行前缀和的计算

前缀和的并行计算方法有许多种,David Callahan的论文“Recognizing and Parallelizing Bounded Recurrences”中给出了一种适合共享存储多处理器系统中的有界递归计算的通用方法,前缀和计算属于有界递归计算的一个特例。下面先以一个实例来讲解整个并行计算的过程:

例:假设有4个处理器要计算16个整数的前缀和,这16个整数如下:

1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16

1步,先将上面数据平分成4组,每个处理器各计算一组数据的前缀和,如下所示:

1   2   3   4 5   6   7   8 9   10   11   12 13   14   15   16

1   3   6   10 5   11   18   26 9   19   30   42 13   27   42   58

2步,选取每组数据的***一个数据,对这几个数据计算前缀和,如下所示:

1  3  6   10 5   11   18   26 9   19   30   42 13   27   42  58

1  3  6   10 5   11   18   36 9   19   30   78 13   27   42  136

经过这步的计算后,可以很容易发现,每组的***一个数据的值已经变成了原始数据在它所处位置之前(包含本位置)的所有数据的和。例如:

36 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8

78 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12

3步:从第2组数开始,将每组中的数(除***一个数外)加上它的前一组数的***一个数,即可得到所有数的前缀和。如下所示:

 (1 3 6 10) (5+10 11+10 18+10 36) (9+36 19+36 30+36 78)  (13+78 27+78 42+78 136

(1  3  6  10)  (15  21  28  36)  (45  55  66  78)  (91  105  120  136

从上面的计算过程可以看出,第1步和第3步都是很容易进行并行化计算,第2步中,由于计算量非常小,用串行计算即可,下面给出上面处理过程的代码实现:

#define  MIN_PRARLLEL_PREFIXSUM_COUNT    8192       template<class T>  void Parallel_PrefixSum(T * pInput, T *pOutput, int nLen)  {      int i;         int nCore = omp_get_num_procs();            if ( nCore < 4 || nLen < MIN_PRARLLEL_PREFIXSUM_COUNT )      {          Sequential_PrefixSum(pInput, pOutput, nLen);          return;      }            int nStep = nLen / nCore;      if ( nStep * nCore < nLen )      {          nStep += 1;      }     #pragma omp parallel for num_threads(nCore)      for ( i = 0; i < nCore; i++ )      {          int k;          int nStart = i * nStep;          int nEnd = (i+1) * nStep;          if ( nEnd > nLen )          {              nEnd = nLen;          }          pOutput[nStart] = pInput[nStart];          for ( k = nStart+1; k < nEnd; k++ )          {              pOutput[k] = pInput[k] + pOutput[k-1];          }      }         for ( i = 2; i < nCore; i++ )      {          pOutput[i * nStep - 1] += pOutput[(i-1) * nStep - 1];      }         pOutput[nLen-1] += pOutput[(nCore-1)*nStep - 1];     #pragma omp parallel for num_threads(nCore-1)      for ( i = 1; i < nCore; i++ )      {          int k;          int nStart = i * nStep;          int nEnd = (i+1) * nStep - 1;          if ( nEnd >= nLen )          {              nEnd = nLen - 1;          }          for ( k = nStart; k < nEnd; k++ )          {              pOutput[k] += pOutput[nStart-1];          }      }      return;  }

从上面并行前缀和的计算过程可以看出,它的计算量比串行前缀和的计算增加了差不多一倍,如果考虑程序中的实际开销,计算增加量还不止一倍。因此在双核CPU机器上,使用并行前缀和计算没有任何意义,只有在超过4核CPU机器上,它才有实用价值。

Parallel_PrefixSum()函数中,先是判断CPU核数是否小于4,并且判断了计算量是否不足,如果两个判断条件中有任何一个满足,则调用串行前缀核计算函数进行计算,然后才进行并行前缀和的计算。在并行计算时只是简单地将计算平摊到各个CPU上,没有考虑CPU核数较多情况下计算量平摊到各个CPU核上,线程粒度过小的问题,主要是为了不使代码看起来过于繁琐。如有需要可以修改成自动计算出最合适的线程数量(可能小于CPU核数),然后并行计算时使用相应的线程数量即可。

“多核中的并行前缀和计算分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 多核中的并行前缀和计算分析

本文链接: https://www.lsjlt.com/news/86402.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 多核中的并行前缀和计算分析
    本篇内容介绍了“多核中的并行前缀和计算分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、串行前缀和的计...
    99+
    2022-10-19
  • C++前缀和与差分算法的示例分析
    这篇文章将为大家详细讲解有关C++前缀和与差分算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、前缀和前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的...
    99+
    2023-06-25
  • Java数据结构和算法之前缀、中缀和后缀表达式的示例分析
    小编给大家分享一下Java数据结构和算法之前缀、中缀和后缀表达式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、人如何解析算术表达式如何解析算术表达式?或者换种说法,遇到某个算术表达式,我们是如何计算的:①、求...
    99+
    2023-06-28
  • Python 多核并行计算的示例代码
    以前写点小程序其实根本不在乎并行,单核跑跑也没什么问题,而且我的电脑也只有双核四个超线程(下面就统称核好了),觉得去折腾并行没啥意义(除非在做IO密集型任务)。然后自从用上了32核128GB内存,看到 ht...
    99+
    2022-06-04
    多核 示例 代码
  • Go 语言中如何利用多核 CPU 实现并行计算
    本篇文章给大家分享的是有关Go 语言中如何利用多核 CPU 实现并行计算,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。开始之前,我们先澄清两个概念,「多核」指的是有效利用 CP...
    99+
    2023-06-20
  • 如何在Python中进行并行计算和分布式计算
    如何在Python中进行并行计算和分布式计算随着计算机技术的不断发展和硬件性能的提升,利用多核处理器进行并行计算和分布式计算已成为提高程序性能的重要手段之一。而Python作为一门简洁易用且功能强大的编程语言,也提供了丰富的库和工具来支持并...
    99+
    2023-10-22
    并行计算 (Parallel computing) Python (Python) 分布式计算 (Distributed
  • golang中并发和并行的示例分析
    这篇文章主要介绍了golang中并发和并行的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是golanggolang 是Google开发的一种静态强类型、编译型、...
    99+
    2023-06-15
  • 如何进行python核心模块中pickle和cPickle的分析
    如何进行python核心模块中pickle和cPickle的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。pickle模块使用的数据格式是python专用的,并且不同版...
    99+
    2023-06-04
  • 如何在Java中使用Numpy进行科学计算和数据分析?
    Java是一种流行的编程语言,用于开发各种类型的应用程序,包括科学计算和数据分析。Numpy是一个Python库,用于处理大规模的多维数组和矩阵运算。在本文中,我们将介绍如何在Java中使用Numpy进行科学计算和数据分析。 一、安装Jav...
    99+
    2023-06-14
    http numpy 索引
  • git中包含多个分支和合并实现的实例分析
    git中包含多个分支和合并实现的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下面和大家讲解一下git的使用。一、包含多个分支和合并实现的实例出现合并冲突的实例[roo...
    99+
    2023-06-28
  • JavaScript中二分查找法和计算重复次数的示例分析
    这篇文章主要介绍JavaScript中二分查找法和计算重复次数的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:javascript数据结构与算法---检索算法(二分...
    99+
    2022-10-19
  • 前端面试中字节的笔试题和算法题示例分析
    这篇文章将为大家详细讲解有关字节的笔试题和算法题示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。题目给定一个包含 m x n 个元素的矩阵(m 行, ...
    99+
    2022-10-19
  • PHP开发中如何处理大数据量的计算和分析
    随着互联网的快速发展和大数据时代的到来,处理大数据量的计算和分析成为了PHP开发人员面临的一个重要挑战。在本文中,我将介绍一些处理大数据量的计算和分析的方法,并提供具体的代码示例。数据库索引优化在处理大数据量的计算和分析时,数据库是最常用的...
    99+
    2023-10-21
    计算 分析 大数据量
  • 如何在ASP接口容器中使用NumPy进行科学计算和数据分析?
    在ASP.NET环境下,我们经常会使用C#或VB.NET进行开发,这些语言都是强类型语言,但是对于一些需要进行科学计算和数据分析的应用程序,使用强类型语言进行开发可能会比较困难。此时,我们可以考虑使用NumPy这个科学计算库。 NumPy...
    99+
    2023-09-15
    接口 容器 numpy
  • 级联slave中延迟计算和query event exe time获取方法的示例分析
    这篇文章主要为大家展示了“级联slave中延迟计算和query event exe time获取方法的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“级联...
    99+
    2022-10-18
  • 怎么分析Python代码审计中的反序列化和命令执行
    这篇文章给大家介绍怎么分析Python代码审计中的反序列化和命令执行,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、介绍Python代码审计方法多种多样,但是总而言之是根据前人思路的迁移融合扩展而形成。目前Pytho...
    99+
    2023-06-17
  • Vue中匿名插槽与作用域插槽合并和覆盖行为的示例分析
    小编给大家分享一下Vue中匿名插槽与作用域插槽合并和覆盖行为的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Vue 测试...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作