C++ 并行化小阵列比并行化大阵列慢?

C++ 并行化小阵列比并行化大阵列慢?,c++,parallel-processing,openmp,icc,C++,Parallel Processing,Openmp,Icc,我编写了一个小程序,为两个数组生成随机值,在for循环中,将所述数组的值添加到一个新数组中 然而,当我使用一个小数组(20个元素)时,并行版本比串行版本花费的时间要长得多,而当我使用大数组(20万个元素)时,所花费的时间大致相同(虽然并行总是稍微慢一点) 为什么会这样? 我能想到的唯一原因是,对于大型阵列,CPU将其放在L3缓存中,并在所有内核之间共享它,而对于小型阵列,它必须在较低的缓存级别周围复制它?还是我弄错了 代码如下: #包括 #包括 #包括 #包括 #包括 int main() {

我编写了一个小程序,为两个数组生成随机值,在for循环中,将所述数组的值添加到一个新数组中

然而,当我使用一个小数组(20个元素)时,并行版本比串行版本花费的时间要长得多,而当我使用大数组(20万个元素)时,所花费的时间大致相同(虽然并行总是稍微慢一点)

为什么会这样? 我能想到的唯一原因是,对于大型阵列,CPU将其放在L3缓存中,并在所有内核之间共享它,而对于小型阵列,它必须在较低的缓存级别周围复制它?还是我弄错了

代码如下:

#包括
#包括
#包括
#包括
#包括
int main()
{
整数规模=2000000;
标准::数组num1(大小)、num2(大小)、结果(大小);
std::srand(std::time(nullptr));
std::chrono::时间点开始、停止;
标准时间:微秒持续时间;
对于(int i=0;istd::cout关于
srand
,您可能需要观察。影响这一点的因素:启动一个线程有很多开销,因此
size
的小值将在一个线程上运行得更快;您的循环性能受内存限制,超过两个线程不太可能提高;
size
的小值可能导致多个线程在写入同一缓存线的8个线程中。顺便说一句,不能保证线程将在不同的内核上运行。最糟糕的情况是,它们被安排在同一个内核上。优化并不总是提高代码的速度。这就是为什么必须手动启用它们。这可能是问题的一部分。另外,需要注意的是,使用simd也是我们的选择因为你的代码可以很容易地矢量化,所以这里是不完整的。不管你有什么问题,你都会看到一些加速。
Parallel for loop executed in: 2450 microseconds
Serial for loop executed in: 2726 microseconds
Parallel for loop executed in: 4727 microseconds
Serial for loop executed in: 0 microseconds