poster
2019-12-10, 20:41
我正在处理的代码具有如下循环:
bistar = zeros(numdims,numcases); parfor hh=1:nt bistar = bistar + A(:,:,hh)*data(:,:,hh+1)' ; end 对于小nt(10)。
计时后,实际上比使用常规循环慢100倍 !!!我知道parfor可以进行并行求和,所以我不确定为什么这不起作用。
我跑
matlabpool 开箱即用的配置,然后再运行我的代码。
我对matlab相对较新,并且刚开始使用并行功能,因此请不要以为我没有做任何愚蠢的事情。
谢谢!
PS:我正在四核上运行代码,所以我希望看到一些改进。
回答:
对于较小的nt对结果进行分区和分组(在工作划分和从多个线程/核心收集结果的开销)很大。这是正常现象,您不会对可以在简单循环中快速执行的简单任务进行数据分区。
始终在循环内执行具有挑战性的操作,值得进行分区。这是并行编程 (https://computing.llnl.gov/tutorials/parallel_comp/)的不错的介绍 (https://computing.llnl.gov/tutorials/parallel_comp/) 。
线程来自线程池,因此创建线程的开销不应该存在。但是,为了创建部分结果,必须根据bistar大小创建n矩阵,计算所有部分结果,然后必须添加所有这些部分结果(重新组合)。在一个直线循环中,这很可能就地完成,没有分配发生。
帮助中的完整声明(感谢您在下面的链接)为:
如果计算f,g和h的时间很大,即使n相对较小,parfor也会比相应的for语句快得多。
因此,您会看到它们的含义与我的意思完全相同,仅当您在循环中执行的操作很复杂/非常耗时时,小n值的开销才值得付出努力。
更多&回答... (https://stackoverflow.com/questions/3174358)
bistar = zeros(numdims,numcases); parfor hh=1:nt bistar = bistar + A(:,:,hh)*data(:,:,hh+1)' ; end 对于小nt(10)。
计时后,实际上比使用常规循环慢100倍 !!!我知道parfor可以进行并行求和,所以我不确定为什么这不起作用。
我跑
matlabpool 开箱即用的配置,然后再运行我的代码。
我对matlab相对较新,并且刚开始使用并行功能,因此请不要以为我没有做任何愚蠢的事情。
谢谢!
PS:我正在四核上运行代码,所以我希望看到一些改进。
回答:
对于较小的nt对结果进行分区和分组(在工作划分和从多个线程/核心收集结果的开销)很大。这是正常现象,您不会对可以在简单循环中快速执行的简单任务进行数据分区。
始终在循环内执行具有挑战性的操作,值得进行分区。这是并行编程 (https://computing.llnl.gov/tutorials/parallel_comp/)的不错的介绍 (https://computing.llnl.gov/tutorials/parallel_comp/) 。
线程来自线程池,因此创建线程的开销不应该存在。但是,为了创建部分结果,必须根据bistar大小创建n矩阵,计算所有部分结果,然后必须添加所有这些部分结果(重新组合)。在一个直线循环中,这很可能就地完成,没有分配发生。
帮助中的完整声明(感谢您在下面的链接)为:
如果计算f,g和h的时间很大,即使n相对较小,parfor也会比相应的for语句快得多。
因此,您会看到它们的含义与我的意思完全相同,仅当您在循环中执行的操作很复杂/非常耗时时,小n值的开销才值得付出努力。
更多&回答... (https://stackoverflow.com/questions/3174358)