我正在研究自适应矩阵向量乘法的 MATLAB 实现,用于来自 PDE 的特定离散化(具有已知的稀疏结构)的非常大的稀疏矩阵。
经过大量预处理后,我最终得到了许多不同的块(比方说,大于 200),我想为它们计算选定的条目。
预处理步骤之一是确定我想要计算的每个块的(数量)条目,这使我几乎可以完美地衡量每个块将花费的时间(对于所有意图和目的,正交工作是每个条目相同)。
感谢/sf/answers/695706651/,我能够通过以相反的顺序对块进行排序来利用它,从而促使 MATLAB 首先从最大的块开始。
然而,条目的数量因块而异,以至于直接运行 parfor 受到条目数量最多的块的严重限制,即使它们被反向送入循环。
我的解决方案是串行执行最大的块(但在条目级别并行!),只要每个 iterand 的开销无关紧要,就可以了。块不会变得太小。然后我用 parfor 做其余的块。理想情况下,我会让 MATLAB 决定如何处理这个问题,但是由于嵌套的 parfor 循环失去了并行性,所以这不起作用。此外,将两个循环打包成一个(几乎)是不可能的。
我现在的问题是关于如何最好地确定串行和并行机制之间的这个截止点,考虑到我对条目数量的信息(不同问题的有序条目曲线的形状可能不同),如以及我可用的工人数量。
到目前为止,我一直在与标准 PCT 许可下的 12 个工作人员一起工作,但是自从我现在开始在一个集群上工作,确定这个截止变得越来越重要(因为对于许多内核来说,与并行循环相比,串行循环变得越来越昂贵,但类似地,拥有阻止其余部分的块的成本甚至更高)。
对于 12 个内核(对应于我正在使用的计算服务器的配置),我已经找到了一个合理的参数,即每个工人 100 个条目作为截止,但是当内核数不是相对于块的数量来说小了(例如 64 对 200)。
我试图减少具有不同功率(例如 1/2、3/4)的内核数量,但这也不能始终如一地工作。接下来,我尝试将块分组并确定当条目大于每批的平均值时的截止值,分别是。他们离结束的批次数:
logical_sml = true(1,num_core); i = 0;
while all(logical_sml)
i = i+1;
m = mean(num_entr_asc(1:min(i*num_core,end))); % "asc" ~ ascending order
logical_sml = num_entr_asc(i*num_core+(1:num_core)) < i^(3/4)*m;
% if the small blocks were parallelised perfectly, i.e. all
% cores take the same …Run Code Online (Sandbox Code Playgroud) 我想为每个block1和parallerlize外循环并行化block2.
以前的代码:
Run Code Online (Sandbox Code Playgroud)for i=rangei <block1> for j=rangej <block2> dependent on <block1> end end
改变了代码:
Run Code Online (Sandbox Code Playgroud)parfor i=rangei <block1> parfor j=rangej <block2> dependent on <block1> end end
这可以获得多少效率,改变后的代码会做正确的事情吗?更改后的代码是否符合我的要求?
我有这些嵌套的for循环,我想转换为parfor:
row = 1;
for i = 5 : 0.2 : 5.4
col = 1;
for j = 2 : 0.5 : 2.5
matrx(row, col) = i * j;
col = col + 1;
end
row = row + 1;
end
Run Code Online (Sandbox Code Playgroud)
有没有人可以这样做?