显示经过时间随 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 的运行时间增加。
我的困惑是当按线程数划分的任务所用时间应该减少时。我的意思是如果线程数增加,经过的时间就会减少。但是,我发现我的结果有所不同。
如果有人能帮助我找出我在代码中遗漏的内容,那就太好了。
谢谢。
在您的 main
中使用 omp_set_num_threads(thread_count);
来设置线程数。
从速度测量中排除打印输出,因为它与计算无关,而且它是代码中最慢的部分。
使用动态计划#pragma omp parallel for schedule(dynamic)
。使用默认计划时负载平衡不是最佳的,因为 p
越大,工作负载越低。
您的代码存在竞争条件,这是 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 架构,您的代码都应该正常工作(并按设计)。
- 进行这些更改后,我看到加速:
term=100000000;
Thread 1, Elapsed time = 6.903768e-01 seconds
Thread 8, Elapsed time = 2.813646e-01 seconds
我已经实现了埃拉托色尼筛法,使用 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 的运行时间增加。
我的困惑是当按线程数划分的任务所用时间应该减少时。我的意思是如果线程数增加,经过的时间就会减少。但是,我发现我的结果有所不同。
如果有人能帮助我找出我在代码中遗漏的内容,那就太好了。
谢谢。
在您的
main
中使用omp_set_num_threads(thread_count);
来设置线程数。从速度测量中排除打印输出,因为它与计算无关,而且它是代码中最慢的部分。
使用动态计划
#pragma omp parallel for schedule(dynamic)
。使用默认计划时负载平衡不是最佳的,因为p
越大,工作负载越低。您的代码存在竞争条件,这是 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 架构,您的代码都应该正常工作(并按设计)。
- 进行这些更改后,我看到加速:
term=100000000;
Thread 1, Elapsed time = 6.903768e-01 seconds
Thread 8, Elapsed time = 2.813646e-01 seconds