假设我有一个包含N个元素的向量(数组,列表等),假设为V0到V(N-1)。对于每个元素Vi,需要计算每个索引j(包括i=j)的函数f(Vi,Vj)。该函数是对称的,因此一旦计算出f(Vi,Vj),就无需重新计算f(Vj,Vi)。然后总共有N(N+1)/2次函数求值,使得这是一个O(N2)的算法。假设计算f所需的时间相对较长但是一致的。
现在,我想并行执行算法。我需要确定(某些数量M的)工作线程的调度,以便两个线程不同时使用内存的相同部分(即相同的元素)。例如,可以并行评估f(V1,V2)和f(V3,V4),但不能并行评估f(V2,V3)。工作流程被分成步骤,每个步骤中,每个工作线程执行一次f的评估。然后对线程进行同步,然后它们继续进行下一步。
问题是,如何确定每个线程的调度(最好是最优的),作为索引对(i,j)的一系列,以便解决完整的问题(即考虑对称性访问每个索引对恰好一次)? 尽管直接回答当然很好,但我也会感激一个指向算法或甚至相关网站/文献的指针。
现在,我想并行执行算法。我需要确定(某些数量M的)工作线程的调度,以便两个线程不同时使用内存的相同部分(即相同的元素)。例如,可以并行评估f(V1,V2)和f(V3,V4),但不能并行评估f(V2,V3)。工作流程被分成步骤,每个步骤中,每个工作线程执行一次f的评估。然后对线程进行同步,然后它们继续进行下一步。
问题是,如何确定每个线程的调度(最好是最优的),作为索引对(i,j)的一系列,以便解决完整的问题(即考虑对称性访问每个索引对恰好一次)? 尽管直接回答当然很好,但我也会感激一个指向算法或甚至相关网站/文献的指针。
f()
函数与第二个向量做了什么?如果可以进行调整以允许同时处理重叠的成对数据,则分配任务的问题变得容易得多。例如,第二个向量是否用于记录结果?如果是这样,f()
是否可以改为将结果写入到 2D 向量的[i][j]
(和可能是[j][i]
)- 然后一旦所有并行工作完成,您只需要将该 2D 向量合并到所需的 1D 版本即可。 - DMA57361