显示经过时间随 openMP 代码中线程数变化的变化

showing the variation in elapsed time with number of threads change in openMP code

我已经实现了埃拉托色尼筛法,使用 openMp 方法针对各种项值和线程找出素数。

这是我的代码

// Type your code here, or load an example.
#include <stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<omp.h>
 

void SieveOfEratosthenes(int n)
{  
      
    bool prime[n + 1];
    memset(prime, true, sizeof(prime));
    
    const int end_p=sqrt(n);
    #pragma omp parallel for 
    for (int p = 2; p <= end_p; p++)
    {
        bool prime_p;
        #pragma omp atomic read
        prime_p=prime[p];
        if (prime_p == true)
        {
            for (int i = p * p; i <= n; i += p)
            {
                #pragma omp atomic write
                prime[i] = false;
            }
        }
    }
    
    for (int p = 2; p <= n; p++)
        if (prime[p])
            printf("%d  ", p);
    
}
int main(int argc, char* argv[]){
        int procs;
        int term =100;
        double start,finish;
        procs = omp_get_num_procs();
        omp_set_num_threads(procs);
        start = omp_get_wtime();
        SieveOfEratosthenes(term);
        finish = omp_get_wtime();
        printf("Elapsed time = %e seconds\n", finish - start);

        return 0;
}

我将显示各种术语和线程的运行时间输出

结果如下:

1.term=100
a)Thread 1 , elapsed time= 3.879014e-04 seconds
b)Thread 2, elapsed time = 3.887471e-04 seconds
c)Thread 4, elapsed time = 3.742063e-04 seconds
d)Thread 8, elapsed time = 3.988100e-04 seconds
e)Thread 16, elapsed time = 5.262811e-04 seconds

2.term = 100000
a)Thread 1, elapsed time = 6.131708e-03
b)Thread 2, elapsed time = 4.231855e-03
c)Thread 4, elapsed time = 4.193152e-03
d)Thread 8, elapsed time = 6.109135e-03
e)Thread 16, elapsed time = 4.225969e-03

3.term = 100000000
a)Thread 1, elapsed time = 1.237387e+01
b)Thread 2, elapsed time = 1.184531e+01
c)Thread 4, elapsed time = 1.160130e+01
d)Thread 8, elapsed time = 1.128761e+01
e)Thread 16, elapsed time = 1.18116e+01seconds

现在我可以从统计数据中看到当线程 8,16(1-d),e)) 的任期为 100 时增加的运行时间

当 term = 100000 时,线程 8(2 d)) 的运行时间增加,然后再次减少。

当 term = 100000000 时,线程数 16 的运行时间比线程数 8 的运行时间增加。

我的困惑是当按线程数划分的任务所用时间应该减少时。我的意思是如果线程数增加,经过的时间就会减少。但是,我发现我的结果有所不同。

如果有人能帮助我找出我在代码中遗漏的内容,那就太好了。

谢谢。

  1. 在您的 main 中使用 omp_set_num_threads(thread_count); 来设置线程数。

  2. 从速度测量中排除打印输出,因为它与计算无关,而且它是代码中最慢的部分。

  3. 使用动态计划#pragma omp parallel for schedule(dynamic)。使用默认计划时负载平衡不是最佳的,因为 p 越大,工作负载越低。

  4. 您的代码存在竞争条件,这是 C 语言中的未定义行为。

I saw that atomic operation did not have any effect on the code. I got same result with them without them.

请理解,即使您碰巧在给定的 compiler/architecture(例如 x86/64)上得到正确的结果,也并不一定意味着您的代码是正确的。使用任何 compilers/computer 架构,您的代码都应该正常工作(并按设计)。

  1. 进行这些更改后,我看到加速:
term=100000000;
Thread 1, Elapsed time = 6.903768e-01 seconds
Thread 8, Elapsed time = 2.813646e-01 seconds