草庐IT

并行机

全部标签

c++ - CUDA 动态并行,性能差

我们在使用CUDA动态并行时遇到了性能问题。目前,CDP的执行速度至少比传统方法慢3倍。我们做了最简单的可重现代码来展示这个问题,就是把一个数组的所有元素的值都增加+1。即,a[0,0,0,0,0,0,0,.....,0]-->kernel+1-->a[1,1,1,1,1,1,1,1,1]这个简单示例的目的只是为了查看CDP是否可以像其他的一样执行,或者是否存在严重的开销。代码在这里:#include#include#defineBLOCKSIZE512__global__voidkernel_parent(int*a,intn,intN);__global__voidkernel_s

c++ - 在 C++ 中跨文件行并行化函数的惯用方法

我发现自己经常编写以下形式的C++代码:while(getline(strm,line)){cout我想并行化这段代码。到目前为止,我提出的最佳解决方案是构建字符串vector以容纳大量(10000-100000)行,然后使用在该vector上并行化#pragmaompparallelfor然后清空vector并在保留行的同时重复。但是,这种方法需要大量内存,并且在主进程缓冲字符串时其他内核处于空闲状态。有没有更好的办法?类似于Python的multiprocessing.Pool.map或Hadoop?(不过,我想避免使用Hadoop的C++API,因为Hadoop相当重量级,可能不

c++ - 融合三角循环进行并行化,计算子索引

并行化中的一种常见技术是像这样融合嵌套的for循环for(inti=0;i到for(intx=0;x我想知道我怎样才能像这样融合一个三角形循环for(inti=0;i这有n*(n+1)/2次迭代。我们将融合迭代称为x。使用二次公式,我得出了这个:for(intx=0;x与融合方形循环不同,这需要使用sqrt函数以及从int到float以及从float到int的转换。我想知道是否有更简单或更有效的方法来做到这一点?例如,不需要sqrt函数或从int到float或从float到int的转换的解决方案。编辑:我不想要一个依赖于上一次或下一次迭代的解决方案。我只想要像inti=funci(x)

c++ - 理论上,find_end 是可并行化的吗?

我目前正在研究open-stdproposal为我正在处理的项目带来并行功能,但我遇到了find_end的障碍。现在find_end可以描述为:Analgorithmthatsearchesforthelastsubsequenceofelements[s_first,s_last)intherange[first,last).Thefirstversionusesoperator==tocomparetheelements,thesecondversionusesthegivenbinarypredicatep.它的要求由cppreference列出.现在我并行化find/findi

c++ - 如何在不同的核心(并行)上分别运行 4 个线程?

我想并行运行(不同时)1四个线程做完全独立的事情。我是并行性的新手,我有几个问题。我之所以要这样做,是因为性能对我来说真的很重要。我在4核Windows机器上工作,我在VisualStudioCommunity2015中使用C++。我应该尝试自己安排线程,以便每个线程都在不同的内核上运行,还是应该让OSScheduler来做?在我看来,我认为如果我强制它在不同的核心上运行每个线程会更快。我该怎么做?这是我目前尝试过的:#includevoidt1(){//dosomething}voidt2(){//dosomething}voidt3(){//dosomething}voidt4()

c++ - 使用 openmp 并行化内循环

我有三个嵌套循环,但只有最里面的循环是可并行的。外循环和中循环停止条件取决于最内层循环所做的计算,因此我无法更改顺序。我在最内层循环之前使用了OPENMPpragma指令,但两个线程的性能比一个线程差。我猜这是因为线程是在外循环的每次迭代中创建的。有没有办法在外层循环之外创建线程,而只在最内层循环中使用它?提前致谢 最佳答案 OpenMP应该使用线程池,这样您就不会在每次执行循环时都重新创建线程。然而,严格来说,这可能取决于您使用的OpenMP实现(我知道GNU编译器使用池)。我建议您寻找其他常见问题,例如虚假分享。

c++ - OpenMP 中的并行合并排序

我在this中看到了并行合并排序算法纸。这是代码:voidmergesort_parallel_omp(inta[],intsize,inttemp[],intthreads){if(threads==1){mergesort_serial(a,size,temp);}elseif(threads>1){#pragmaompparallelsections{#pragmaompsectionmergesort_parallel_omp(a,size/2,temp,threads/2);#pragmaompsectionmergesort_parallel_omp(a+size/2,si

c++ - 并行计算内存访问瓶颈

以下算法在我的程序中迭代运行。运行它,没有下面指示的两行,需要1.5倍的时间。这让我非常惊讶。然而,更糟糕的是,运行这两条线会将完成度提高到不运行它们的4.4倍(6.6倍未运行整个算法)。此外,它导致我的程序无法扩展到超过8个核心。事实上,当在单核上运行时,这两条线仅将时间增加到1.7倍,考虑到它们的作用,这仍然太高了。我已经排除了它与我程序中其他地方修改后的数据的影响有关。所以我想知道是什么原因造成的。可能与缓存有关?voidNetClass::Age_Increment(vector&synapses,intk){intsize=synapses.size();inttarget=

c++ - 何时使用并行计数 - 当内存有问题时使用 MIT HAKMEM 进行位计数?

比特计数可以通过多种方式完成,例如。带有设置位迭代器、未设置位迭代器、带有查找表或并行计数的预计算位。正如我通过搜索网络发现的那样,当未设置位较少时,未设置位迭代器速度很快,而设置位迭代器则相反。但是什么时候应该使用并行计数,尤其是MITHAKMEM(见下文)?它看起来相当快,尽管可能比查找表慢。就速度而言,它总是比设置/未设置位更好吗?除了速度和内存之外,还有其他关于选择哪一个的问题吗?intBitCount(unsignedintu){unsignedintuCount;uCount=u-((u>>1)&033333333333)-((u>>2)&011111111111);ret

矩阵数乘与并行计算的结合

1.背景介绍矩阵数乘是线性代数的基本操作,在计算机科学和数学领域具有广泛的应用。随着大数据时代的到来,矩阵数乘的计算量越来越大,需要高效的算法和并行计算技术来支持。本文将介绍矩阵数乘与并行计算的结合,包括核心概念、算法原理、具体操作步骤、代码实例以及未来发展趋势与挑战。2.核心概念与联系2.1矩阵数乘矩阵数乘是指将两个矩阵相乘得到一个矩阵的过程。矩阵A和矩阵B的乘积记作AB,其中A的行数等于B的列数。具体地,对于A的每一行,将该行的元素与B的每一列的元素相乘,然后将结果相加得到AB的元素。2.2并行计算并行计算是指在多个处理器或线程同时执行任务,以提高计算效率的方法。并行计算可以分为数据并行、