执行时间取决于使用 OpenMP 库增加的线程数?

Posted

技术标签:

【中文标题】执行时间取决于使用 OpenMP 库增加的线程数?【英文标题】:How time executing depends of increasing of number of threads with using OpenMP library? 【发布时间】:2017-11-02 16:34:11 【问题描述】:

增加线程数会增加而不是减少循环执行时间。

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <limits.h>
#define n 4

int main(int argc, char **argv)

    FILE * file1 = fopen("output.txt", "w");
    if (file1 == NULL)
        exit(EXIT_FAILURE);
    

    srand(time(NULL));
    int matrix[n][n];
    int i, j;
    for(i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            matrix[i][j] = rand() % 100 + 1;
            fprintf(file1, "%d ", matrix[i][j]);
        
        fprintf(file1, "\n");
    
    int sum = 0;
    int min;
    double start;
    double end;

开始计算循环的时间

    start = omp_get_wtime();

// in num_threads I've changed the number of threads 
// and investigate a problem of increasing the time

#pragma omp parallel for private (i, j, min) reduction(+:sum)       num_threads(4) 
        for(i = 0; i < n; i++)
            min = INT_MAX;
            for (j = 0; j < n; j++)
                if(matrix[j][i] < min)
                    min = matrix[j][i];
                    
            
            sum += min; // sum of min numbers of each column
        
end = omp_get_wtime();

printf("Time: %lf\n", end - start);

printf("Min sum of matrix = %d", sum);
fclose(file1);
return 0;


4 线程 时间:0.000930 3 线程 时间:0.000356 2 个线程 时间:0.000533 1 个线程 时间:0.000008

我的 CPU 有 4 个线程。

【问题讨论】:

对于每个线程,操作系统需要调度线程的执行。线程越多,操作系统在调度上花费的时间就越多。此外,不能保证线程将是 CPU 内核执行的唯一程序。最坏的情况是,所有线程都在同一个核心上执行。更不用说资源共享的突发事件了。 您的线程需要有大量的执行时间。在创建所有其他线程之前完成的线程可能不值得作为线程。 如果您使用的是GPU,操作系统需要将代码下载到GPU核心,这需要时间。然后操作系统需要告诉 GPU 运行线程。在某些时候,GPU 需要中断操作系统并让操作系统知道线程已完成。操作系统需要从 GPU 获取任何结果。将此开销乘以每个额外的线程。 顺便说一句,线程管理与语言、C、C++ 或 Pascal 无关。操作系统正在执行与语言无关的可执行文件和与语言无关的线程。该程序也可以用 Ada 编写。 您的基准测试算法需要修改。 fprint 将成为瓶颈并导致线程之间的资源共享。一个线程必须等待使用该文件的线程完成才能启动或继续。一般来说,文件 I/O 比线程维护更容易成为瓶颈。每个 I/O 事务花费的时间也可能不是恒定的。 【参考方案1】:

你有一个非常小的问题(4x4),你正在计时线程创建。无论如何,我不希望并行性在这种规模上有多大帮助(因为唤醒线程然后在并行结束时再次同步它们的成本将比您尝试做的工作大得多),但是您可以通过添加一个

#pragma omp parallel ;

在计时区域之前。

并且,请,请,请不要强制线程数。使用令人羡慕的OMP_NUM_THREADS

【讨论】:

以上是关于执行时间取决于使用 OpenMP 库增加的线程数?的主要内容,如果未能解决你的问题,请参考以下文章

openmp:线程数的增加会降低性能

openmp怎么用函数配置线程数

如何获得在整个程序执行期间可能创建的最大 OpenMP 线程数?

增加线程数减少时间

如何增加tomcat线程池中的线程数?

使用 openmp 时运行的线程数不一致