OpenACC 与 OpenMP
OpenACC vs OpenMP
你好,我测试了 OpenACC vs OpenMP vs Nothing,但我得到了奇怪的结果。
代码:
#include <stdio.h>
int main () {
int a,sum=0;
(#pragma omp for/#pragma acc parallel loop/nothing)
for( a = 0 ; a < 2000000000; a = a + 1 ){
sum+=a%2;
}
printf("sum = %d\n",sum);
return 0;
}
- 我为 windows 10 使用子系统 Ubuntu
(https://docs.microsoft.com/en-us/windows/wsl/install-win10 ) 和
GCC 7.1(C 编译器)并得到以下结果:Nothing = OpenMP(大约 5 秒内得到正确结果); OpenACC 更快,但给出了错误的结果(0 对 1 000 000 000)
- 我将 VMware 与 Ubuntu 一起使用,结果是:什么都没有
什么都没有(程序无限执行,我只是关闭终端);打开ACC
显示结果比 OpenMP 快,但再次显示错误结果。
- 如果我从带有 OpenMP 的控制台使用 Intel C++ 编译器,我在 Ubuntu
中得到大约 1.3 秒与 ~5 秒
怎么办?
您有多个不同的线程覆盖 sum
,因此您得到了错误的结果。你需要告诉它这是一个 "reduction"
#pragma omp parallel for reduction(+:sum)
或
#pragma acc parallel loop reduction(+:sum)
Google 'race condition'
事实上,较新版本的 PGI OpenACC 足够智能,可以检测给定变量的减少。这并不意味着您应该编写可能有错误的代码
你好,我测试了 OpenACC vs OpenMP vs Nothing,但我得到了奇怪的结果。
代码:
#include <stdio.h> int main () { int a,sum=0; (#pragma omp for/#pragma acc parallel loop/nothing) for( a = 0 ; a < 2000000000; a = a + 1 ){ sum+=a%2; } printf("sum = %d\n",sum); return 0; }
- 我为 windows 10 使用子系统 Ubuntu (https://docs.microsoft.com/en-us/windows/wsl/install-win10 ) 和 GCC 7.1(C 编译器)并得到以下结果:Nothing = OpenMP(大约 5 秒内得到正确结果); OpenACC 更快,但给出了错误的结果(0 对 1 000 000 000)
- 我将 VMware 与 Ubuntu 一起使用,结果是:什么都没有 什么都没有(程序无限执行,我只是关闭终端);打开ACC 显示结果比 OpenMP 快,但再次显示错误结果。
- 如果我从带有 OpenMP 的控制台使用 Intel C++ 编译器,我在 Ubuntu 中得到大约 1.3 秒与 ~5 秒
怎么办?
您有多个不同的线程覆盖 sum
,因此您得到了错误的结果。你需要告诉它这是一个 "reduction"
#pragma omp parallel for reduction(+:sum)
或
#pragma acc parallel loop reduction(+:sum)
Google 'race condition' 事实上,较新版本的 PGI OpenACC 足够智能,可以检测给定变量的减少。这并不意味着您应该编写可能有错误的代码