编译c++;使用GCC(G+;+;)的OpenACC并行CPU代码 编译时,用GCC-7.3.0(G++)编译 >启用语言= C、C++、LTO禁用多个LIB/代码>以下代码不使用多个内核,而如果用PGC+编译器编译相同代码,则使用多个核。

编译c++;使用GCC(G+;+;)的OpenACC并行CPU代码 编译时,用GCC-7.3.0(G++)编译 >启用语言= C、C++、LTO禁用多个LIB/代码>以下代码不使用多个内核,而如果用PGC+编译器编译相同代码,则使用多个核。,c++,gcc,g++,openacc,C++,Gcc,G++,Openacc,g++编译:g++-lgomp-Ofast-ojsolve-fopenaccjsolvec.cpp pgc++编译:pgc++-o jsolvec.exe jsolvec.cpp-fast-Minfo=opt-ta=multicore 来自OpenACC教程1/solver的代码: //求解线性方程组的雅可比迭代法 //如果矩阵是对角占优的,则保证收敛, //所以我们人为地强迫矩阵对角占优。 //看https://en.wikipedia.org/wiki/Jacobi_method // //

g++编译:
g++-lgomp-Ofast-ojsolve-fopenaccjsolvec.cpp

pgc++编译:
pgc++-o jsolvec.exe jsolvec.cpp-fast-Minfo=opt-ta=multicore

来自OpenACC教程1/solver的代码:

//求解线性方程组的雅可比迭代法
//如果矩阵是对角占优的,则保证收敛,
//所以我们人为地强迫矩阵对角占优。
//看https://en.wikipedia.org/wiki/Jacobi_method
//
//我们求解Ax=b中的向量x
//将矩阵A重写为
//下三角(L),
//上三角(U),
//和对角矩阵(D)。
//
//Ax=(L+D+U)x=b
//
//重新排列以获得:Dx=b-(L+U)x-->x=(b-(L+U)x)/D
//
//我们可以迭代地这样做:x_new=(b-(L+U)x_old)/D
//类型为双精度(默认)或类型为浮点型的生成
//公差为0.001(默认值)或公差为任何其他值的构建
//三个论点:
//矢量大小
//最大迭代次数
//打印残差的频率(每第n次迭代)
#包括
#包括
#包括
#包括
#包括
使用std::cout;
#ifndef型
#定义双精度类型
#恩迪夫
#定义公差0.001
无效的
初始化简单诊断dom(整数,类型*A)
{
int i,j;
//在对角占优矩阵中,对角元素
//大于行中其他元素的总和。
//缩放矩阵,使行元素的总和接近1。
对于(i=0;i1)
nsize=atoi(argv[1]);
如果(nsize 2)
max_iters=atoi(argv[2]);
如果(最大值3)
riter=atoi(argv[3]);

如果(riterGCC中还不支持使用OpenACC在多核CPU上调度并行循环。当然,使用OpenMP可以做到这一点,并且您可以使用混合OpenACC(用于GPU卸载,正如您的代码中已经存在的那样)和OpenMP指令(用于CPU并行化,尚未出现在您的代码中)的代码,以便根据是使用
-fopenacc
还是使用
-fopenmp
编译来使用相应的机制

就像PGI所做的那样,它当然可以在GCC中得到支持;我们当然能够实现它,但它还没有被计划,还没有为GCC提供资金