【发布时间】:2016-09-08 00:28:11
【问题描述】:
如果 pArray 非常大,下面的代码段是我的程序中最耗时的。 last 是这个数组结束位置的变量,Idx 是数组特定位置的变量,所以我想要的是将部分数组元素从Idx 向后移动1。
for(long i = last; i >= Idx; i--)
{
pArray[i] = pArray[i-1];
}
我只是尝试使用 parallel for 来并行化它,但它绝对行不通。谁能告诉我这段代码是否可以与openmp并行化?如果是,如何编码?谢谢。
#pragma omp parallel for
for(long i = last; i >= Idx; i--)
{
pArray[i] = pArray[i-1];
}
【问题讨论】:
-
什么是 pArray?也许你可以只使用
memcpy(它可以比任何并行化都快) -
你想做的有内存依赖。它不能像使用 openmp 一样工作,但是选项 1:您可以尝试临时数组或选项 2:手动划分工作负载(数组),这样不超过 1 个线程可以访问内存位置。
-
如果您只有 1 个内存控制器,memcpy 应该会提供良好的性能。如果拆分成块,则必须处理源与目标重叠。
-
memcpy 无法处理内存重叠,memmove 可以通过使用临时数组来处理,这意味着这些东西需要复制两次,我将尝试检查性能。
-
memcopy 可以通过自动反转循环来处理重叠。你是对的,memcpy 可能会跳过这一步。
标签: arrays algorithm parallel-processing openmp