假设一个 SIZE=128Mb 的数组 arr
,其值从 0 到 128Mb-1。现在假设以下代码:
#pragma omp parallel num_threads(NUM_THREADS)
{
int me = omp_get_thread_num();
odds_local[me] = 0;
int count = 0;
#pragma omp for
for (int i = 0; i < SIZE; i++)
if (arr[i]%2 != 0)
count++;
odds_local[me] = count;
}
最后是循环遍历 odds_local[me]
的值以获得最终结果。为此,如果我在 Linux 中计时并报告用户时间,我会得到 1 个线程和 2 个线程的 0.97s。也就是说,没有任何加速。
我应该在这个程序中改进什么以提高速度吗?谢谢。
最佳答案
我运行了您的确切代码,使用 1 个线程我得到 390 毫秒,使用 2 个线程我得到 190 毫秒。您的问题不在代码中。它必须是基本的东西。这些是我能想到的:
- 不与 OpenMP 链接(使用
g++ filename -fopenmp
); - 在单核机器上运行;
- 在双核上运行,其他东西占据另一个核;
- 在控制计算的这个循环之外计时。
关于c - 提高 OpenMP 程序的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12270517/