好的,这就是问题所在。实现一个简单的循环,该循环调用包含延迟的函数。使用静态、动态和引导式调度将此循环划分到四个线程中。根据循环大小和延迟大小测量每种调度类型的执行时间。
这就是我到目前为止所做的,我不知道我是否走在正确的轨道上
#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"。如果不是,编译器可能会因为优化代码而删除正文(以后不会使用它,因此不需要它)。您可以将时间测量集中在并行池上,而无需输出结果。
如果您的迭代几乎花费相同的时间,那么静态分布应该更快。如果它们差异很大,则动态和指导时间表应该主导您的测量。