问题标签 [pgi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
parallel-processing - PGI 编译器并行化 +=
我正在努力使向量和矩阵类并行化并且遇到了问题。任何时候我都有一个循环形式
for (int i = 0; i < n; i++) b[i] += a[i] ;
该代码具有数据依赖性,不会并行化。使用 intel 编译器时,它很聪明,可以在没有任何编译指示的情况下处理这个问题(我想避免使用编译指示进行无依赖检查,只是因为有大量与此类似的循环,而且情况实际上比这更复杂,并且我希望它检查以防万一确实存在)。
有谁知道允许这样做的 PGI 编译器的编译器标志?
谢谢,
贾斯汀
编辑:for循环中的错误。不是复制粘贴实际循环
fortran - mpich2 中的 mpi_waitall 与 array_of_requests 中的空值
MPICH-2.1.5 和 PGI 编译器出现以下错误;
在以下基于模板的算法的示例 Fortran 代码中,
当array_of_request
in mpi_waitall 获得空值 ( request(i)=0
) 时会发生错误。不满足array_of_request
条件时出现空值。iflag(i)=1
直接的解决方案是注释掉条件,但这会引入发送和接收大小为 0 的消息的开销,这对于大型系统(1000 个内核)是不可行的。
根据MPI 论坛链接,该array_of_requests
列表可能包含空句柄或非活动句柄。
我试过以下,
- 不初始化
array_of_requests
, - 调整大小
array_of_request
以匹配MPI_isend + MPI_irecv
计数, - 将虚拟值分配给
array_of_request
- 我还使用 MPICH-1 以及 OpenMPI 1.4 测试了相同的代码,并且代码可以正常工作。
任何见解将不胜感激!
arrays - Cuda Fortran 4D 数组
我的代码因访问全局内存中的 4D 数组而变慢。
我正在使用 PGI 编译器 2010。
我正在访问的 4D 数组只能从设备读取,并且大小在运行时是已知的。
我想分配给纹理内存,发现我的PGI版本不支持纹理。由于大小仅在运行时才知道,因此也不可能使用常量内存。
像这样在编译时只知道一维,MyFourD(100, x,y,z)
其中 x,y,z 是用户输入。
我的第一个想法是关于指针,但不熟悉指针 fortran。
如果您有如何处理这种情况的经验,我将感谢您的帮助。因为只有这样才能使我的代码比预期慢 5 倍
以下是我正在尝试做的示例代码
此致,
fortran - 无法在 (1) 处分配给 INTENT (IN) 变量 x - 如何解决?
使用 gfortran (mpif90) 编译 Fortran 程序时,遇到以下错误:
当我用 PGI 编译这个程序时,我没有收到这个错误。
关于这个,我有两个问题。
- 这个错误是什么意思?
- 我怎样才能让 gfortran 和 mpif90 编译这个模块文件类似于 PGI?有没有我可以传递的标志来告诉 gfortran 编译器不要担心这个?
任何建议,将不胜感激。
compiler-construction - 在不同编译器(PGI 和 Intel)之间传递包含可分配数组的 fortran 派生类型
我们有一个发展 Nvidia GPU 和 Intel Xeon Phi 的项目。主机代码和 GPU 代码用 Fortran 编写并由 pgfortran 编译。要将我们的一些工作卸载到 Phi,我们必须创建一个由 ifort 编译的共享库(静态链接无法工作)并从代码的 pgfortran 部分调用共享子例程。通过这样做,我们可以将数组从代码的 pgfortran 部分卸载到可以与 Xeon Phi 通信的 intel fortran 共享库。
现在我正在尝试将包含来自代码的 pgfortran 部分的可分配数组的派生类型传递给 ifort 共享库。看起来有些问题。
这是一个简单的例子(这里没有 Xeon Phi 卸载指令):
来电者.f90:
称为.f90:
生成文件:
注意cl%a(1:10)
这里的“”,没有“ (1:10)
”就不会打印任何内容。
这段代码最终打印出了 中的元素,cl(1)%a
然后在我试图打印出数组的下一行遇到了分段错误cl(1)%b
。
如果我将“ cl%a(1:10)
”更改为“cl%a(1:100)”,并删除“ print *, cl%b(1:10)
”。它将给出以下结果:
我们可以发现 b 数组中的元素在那里,但我无法通过“ cl%b(1:10)
”获取它们。
我知道这可能是不同编译器的不同派生类型结构造成的。但我真的想要一种我们可以在编译器之间传递这种派生类型的方法。有什么解决办法吗?
谢谢!
makefile - 使用 pgi 编译器并行生成
我有一组使用 make -j 命令在不同机器上编译的 c++ 文件。仅当我将 pgi 编译器与并行 make 一起使用时才会出现问题,某些文件出现以下错误(此特定错误适用于atprop.cpp文件):
然后我意识到这个错误发生在与许多可执行目标相关的源文件中。例如atprop.cpp使用我在代码中使用的不同宏(无宏、-DUBC、-DVBC)编译了三次。这是 Makefile 中与atprop.cpp相关的部分
变量 $(CPPC)=mpic++ 等于 PGI 编译器的 MPI 包装器的路径。
请注意,如果我使用串行 make(即不带 -j 选项的 make),编译运行顺利,没有问题。
我认为这是问题所在:PGI 编译器创建了一个与源文件同名的临时目标文件(对于上面的示例atprop.o。如果并行运行,使用不同宏的编译将全部写入同一个目标文件,这会导致我上面提到的问题。
这只发生在 PGI 编译器上,当我使用 intel 或 gnu 编译器时,我不会遇到这个问题。所以我的问题是我可以做些什么来缓解 PGI 编译器的这个问题?请记住,我有很多具有相同问题的 c++ 文件,并且我试图避免对 Makefile 进行重大修改。
fortran - 任何现有的 OpenACC 编译器都支持包含可分配数组的派生类型吗?
是否有任何 OpenAcc 编译器支持将包含可分配数组的派生类型复制到 GPU 或从 GPU 复制以及它们在加速代码中的使用?
OpenACC 规范 (v2.0) 声明这是可能的,但我无法在任何地方的编译器中找到它。PGI 编译器支持派生类型,但似乎不支持那些包含可分配数组的类型(请参阅PGI 论坛上的此页面)。虽然自他们以来这可能已经改变,但它似乎并没有在任何地方被宣传(很好)。
cuda - 使用 Fortran 和 CUDA 计算 PI
我正在尝试在 PGI 的 fortran 编译器中制作一个简单的程序。这个简单的程序将使用显卡使用“飞镖板”算法计算 pi。在与这个程序斗争了相当长一段时间之后,我终于让它在大多数情况下都能正常工作。但是,我目前坚持正确传回结果。我必须说,这是一个相当棘手的调试程序,因为我不能再将任何打印语句推入子程序。该程序当前返回全零。我不确定发生了什么,但我有两个想法。我不知道如何解决这两个问题:
- CUDA 内核没有以某种方式运行?
- 我没有正确转换值?
pi_parts = pi_parts_d
嗯,这就是我当前程序的状态。末尾带有的所有变量_d
都代表 CUDA 准备的设备内存,其中所有其他变量(CUDA 内核除外)都是典型的 Fortran CPU 准备变量。现在有一些我已经注释掉的打印语句,我已经从 CPU Fortran 领域尝试过。这些命令是为了检查我是否真的正确地生成了随机数。至于 CUDA 方法,我目前已将计算注释掉并替换z
为静态等于,1
只是为了看看发生了什么。
编辑代码:
更改了各个行以反映以下提到的修复:Robert Crovella
。当前状态:通过cuda-memcheck
显示发现错误:Program hit error 8 on CUDA API call to cudaLaunch
在我的机器上。
如果有什么方法可以用来测试这个程序,请告诉我。我正在投掷飞镖,看看它们在我目前使用 CUDA 的调试方式中落在哪里。不是最理想的,但在我找到另一种方法之前必须这样做。
愿 Fortran 诸神在这黑暗的时刻怜悯我的灵魂。
segmentation-fault - 为什么此代码段错误(在分配期间)与 pgi 而不是英特尔?
此代码在英特尔编译器上运行时有效。但是,当使用 pgi 运行时,它会在列出的子例程中的 * 和 ** 之间出现错误。我正在使用带有-mcmodel-medium 的pgi 编译器。我需要使用 PGI 来开始对这段代码使用 openacc。有什么想法可能是错的吗?提前致谢!
!在这一行没有分配子程序代码段错误
这是主要代码
因此,一些评论者询问了子程序内部的重新分配。我这样做是因为首先我在没有第二次分配的情况下尝试了它,并且当它读取第一个 x() 值时在子例程中收到了分段错误。我又试了一次,注释掉子例程中的分配,发现在读取 x() 期间 PGI seg 出现错误,intel 编译器也这样做了。这条线在上面用粗体表示。
c - 从 PGCC 编译的 OpenACC 加速共享库调用例程时,MEX 中出现未定义符号错误
我有一个libraberto.so
用PGCC
. 它包含 OpenACC pragma 指令,并使用-acc
标志编译以确保启用这些指令。对应的makefile规则为:
其中file1.c
,file2.c
等是构成库的源文件。
然后我有一个mex_gateway.c
文件,它简单地从 MATLAB 调用共享库中的一个例程,将变量(数组和标量)传递给它,然后接收输出数组。它编译如下:
编译工作正常,但是当我尝试在 MATLAB 中运行网关时,出现以下错误:
我无法在 Google 上找到有关此特定错误(符号)的任何信息,并且不确定在哪里查看我的代码。该程序在编译没有 OpenACC 指令(即没有-acc
)的共享库时运行良好。我认为该错误可能是由于 MEX ( mxArray
) 使用的数组的特殊性质造成的,当将数据传输到加速器时,它可能与 OpenACC 不兼容,但是memcpy
在将输入传递给真正malloc
的 C 数组之前将它们传递给共享库例程没有区别。