gpt4 book ai didi

c - OpenMP 基准测试 : Am I doing it right?

转载 作者:太空宇宙 更新时间:2023-11-04 08:49:53 24 4
gpt4 key购买 nike

我制作了一个计算斐波那契数列的程序。我用不同数量的线程(例如 1、2、10)执行它,但执行时间几乎保持不变(大约 0.500 秒)。

我在 Ubuntu 和 GNU GCC 编译器上使用 CodeBlocks。在 CodeBlocks 中,我链接了库 gomp 并为编译器定义了标志 -fopenmp

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i, n=1000, a[n];
omp_set_num_threads(4);

for(i=0; i<n; i++)
{
a[i] = 1 + (rand() % ( 50 - 1 + 1 ) );
}

fibo(n, a);

return 0;
}

void fibo(int sizeN, int n[])
{
int i;

#pragma omp parallel for
for(i=0; i<sizeN; i++)
{
int a = 0, b = 1, next, c;
printf("n = %i\n", n[i]);
for (c=0; c<=n[i]; c++)
{
if (c <= 1)
{
next = c;
}
else
{
next = a + b;
a = b;
b = next;
}
printf("%d\n",next);
}
}
}

有人有想法吗?
我如何才能确保 OpenMP 确实有效(已安装)?

最佳答案

删除两个 printf 语句。与计算数字相比,您的程序花费更多时间将文本发送到标准输出。由于标准输出基本上是串行的,因此您的程序在 printf 语句中进行串行化。更不用说 printf 本身的开销 - 它必须解析格式字符串,将整数值转换为字符串,然后将其发送到 stdout 流。

观察这些测量时间(n = 10000):

OMP_NUM_THREADS=1 ./fibo.exe  0.10s user 0.42s system 40% cpu 1.305 total
^^^^^^^^^^^^
OMP_NUM_THREADS=2 ./fibo.exe 0.24s user 1.01s system 95% cpu 1.303 total
^^^^^^^^^^^^
OMP_NUM_THREADS=4 ./fibo.exe 0.36s user 1.87s system 163% cpu 1.360 total
^^^^^^^^^^^^

我删除了对 omp_set_num_threads() 的调用并改用 OMP_NUM_THREADS,这允许使用不同数量的线程运行程序而无需重新编译源代码。请注意,该程序在系统模式下花费的时间始终比在用户模式下多 4 倍。这是该文本输出的开销。

现在将相同的内容与注释掉的两个 printf 语句进行比较(请注意,我必须将 n 增加到 1000000 以获得有意义的结果从时间):

OMP_NUM_THREADS=1 ./fibo.exe  0.20s user 0.00s system 99% cpu 0.208 total
^^^^^^^^^^^
OMP_NUM_THREADS=2 ./fibo.exe 0.21s user 0.00s system 179% cpu 0.119 total
^^^^^^^^^^^
OMP_NUM_THREADS=4 ./fibo.exe 0.20s user 0.01s system 295% cpu 0.071 total
^^^^^^^^^^^

现在系统时间几乎保持为零,程序在 2 个线程时快 1.75 倍,在 4 个线程时快 2.93 倍。加速不是线性的,因为线程之间的工作分配存在轻微的不平衡。如果数组中填充的是常量值,那么加速几乎是线性的。

关于c - OpenMP 基准测试 : Am I doing it right?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20037800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com