OpenMP 和并行编程的新手需要使用调度对循环进行分区



好的,这就是问题所在。实现一个简单的循环,该循环调用包含延迟的函数。使用静态、动态和引导式调度将此循环划分到四个线程中。根据循环大小和延迟大小测量每种调度类型的执行时间。

这就是我到目前为止所做的,我不知道我是否走在正确的轨道上

#include <omp.h>
#include <stdio.h>
int main() {
    double start_time, run_time;
    omp_set_num_threads(4);
    start_time = omp_get_wtime();
#pragma omp parallel 
#pragma omp for schedule(static)
    for (int n = 0; n < 100; n++){
        printf("square of %d=%dn", n, n*n);
        printf("cube of %d=%dn", n, n*n*n);
        int ID = omp_get_thread_num();
        printf("Thread(%d) n", ID);
    }
    run_time = omp_get_wtime() - start_time;
    printf("Time Elapsed (%f)", run_time);
    getchar();
}

首先,你需要一个循环,其中分布会有所不同。循环有 100 次迭代,因此 OpenMP 计划只会 100 次决定线程的下一次迭代是什么,这不需要任何可测量的时间。printf 的输出需要很长时间,因此在您的代码中,使用哪个计划没有区别。最好制作一个没有控制台输出和非常高的循环计数的循环,例如

#pragma omp parallel
{
    #pragma omp for schedule(static) private(value)
    for (int i = 0; i < 100000000; i++) {
        value = ...
    }
}

最后,您必须在循环中编写代码,例如,在循环之后使用带有 printf 的"result"。如果不是,编译器可能会因为优化代码而删除正文(以后不会使用它,因此不需要它)。您可以将时间测量集中在并行池上,而无需输出结果。

如果您的迭代几乎花费相同的时间,那么静态分布应该更快。如果它们差异很大,则动态和指导时间表应该主导您的测量。

最新更新