问题标签 [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.
arrays - 如何使用 CUDA Fortran 在结构中分配数组?
使用 CUDA,我试图在结构中分配数组,但我遇到了问题,我不知道为什么。struct.cuf
所以这里有一个描述我的问题的短代码(存储在一个名为 的文件中)。我正在使用 进行编译PGI 16.10 version
,并且正在使用以下选项:-O3 -Mcuda=cc60 -tp=x64 struct.cuf -o struct_out
输出错误:
我在这里做错了什么?
我发现(并且有效)的唯一解决方案是将值存储在不同的数组中并将它们传输到 GPU,但它非常“重”。大多数情况下,如果我使用很多像 mytype 这样的结构。
编辑:代码已修改为使用 Vladimir F 的解决方案。如果我device
从声明中删除属性T_Device(3)
,那么分配似乎没问题并且也给出了值(分配下方的注释行)。但我需要该device
属性T_Device(3)
,因为我将在内核中使用它。
谢谢 !
gfortran - pgfortran 等效于 gfortran 中的 -J 开关
当我在 gfortran 中编译代码时,我可以使用-J/dir/
开关设置 .mod 文件的输出目录。现在我切换到使用 PGI pgfortran 编译器进行编译,但找不到等价的。
pgfortran 相当于-J
什么?
fortran - 使用 pgfortran 续行
我正在尝试用 pgf90 或 pgfortran(可以处理各种源文件,即 f90 或 f77)编译一个用 fortran 77 构造(即具有 .f 扩展名)编写的文件。我的问题是续行。
所以这条线显然超出了第 72 列。这是我尝试过的。我尝试通过在新行的第 6 列使用“&”字符将其分成两行并编译它。它编译得很好,但是当我运行程序时,我得到一个错误,说没有找到这样的文件,因为它将行继续解释为 run 和 fort.10 之间的额外空间,并报告找不到文件。
因此,我将代码保留在一行中,然后添加了 -Mextend,这是用于行扩展的 pgi 特定指令。现在它似乎在子例程中很晚的时候在另一个文件名的末尾添加了一些奇怪的字符。它确实正确打开了 fort.10,但它无法在代码中稍后打开另一个文件,并在该文件的末尾添加了一些奇怪的字符(以二进制形式)。在我的编辑器 Emacs 中,我只能在 fort.10 语句之后看到紫色(表明某些事情不正确)。
有 pgi fortran 经验的人可以帮忙吗?
更新
我在 & 处或附近收到 pgf90-s-0034 语法错误(在上线)
pgf 版本是 17.0.4 64 位
fortran - fortran openacc derived types with allocatable
I read manual deep-copying of Fortran derived types is possible, but the following simple test program fails at run time; program compiled cleanly with PGI v16.10. What am getting wrong ?
The error I am getting is:
cuda - cuDevicePrimaryCtxRetain 在 acc_init 之后返回 CUDA_ERROR_INVALID_DEVICE
我正在尝试带有玩具示例(见下文)的新 PGI 社区版本(17.4),并且在调用acc_init
.
重现错误的代码是:
编译:
/usr/local/pgi/linux86-64/17.4/bin/pgcc -acc -ta=tesla -Mcuda ./test.c -o oacc_test.pgi
cuda memcheck 输出:
显然__pgi_uacc_cuda_initdev
将“-1”作为第二个参数(CUdevice dev)传递给cuDevicePrimaryCtxRetain
(bug?):
我想这不正常。这是 17.4 的错误还是我的安装损坏了?
gcc - 将 PGI OpenACC 运行时库直接与 gcc 链接
我有兴趣直接从 GCC 编译的代码中使用 PGI OpenACC 运行时 API。
我注意到 PGI OpenACC 安装提供了两个openacc.h
标头。一个用于 PGI(位于 include/openacc.h
),另一个似乎与 GCC 兼容(etc/include_acc/openacc.h
)。将第二个标头与 GCC 一起使用是否安全?
到目前为止,我已经能够编译并运行一个小测试:
使用 PGI:
pgcc -acc -ta=tesla,cuda8.0 -Mcuda ./test.c -o oacc_test.pgi
使用 GCC + PGI OpenACC:
gcc -isystem /usr/local/cuda-8.0/include -isystem /usr/local/pgi/linux86-64/17.4/etc/include_acc -o oacc_test.both test.c -L/usr/local/cuda-8.0/lib64 -Wl,-rpath,/usr/local/cuda-8.0/lib64 -lcudart -lcuda -L/usr/local/pgi/linux86-64/17.4/lib -Wl,-rpath,/usr/local/pgi/linux86-64/17.4/lib -laccapi -laccg -laccnc -laccn -laccg2 -ldl -lpgc -lm
使用 GCC + GCC OpenACC:(用于比较)
gcc -fopenacc -isystem /usr/local/cuda-8.0/include -o oacc_test.gnu test.c -L/usr/local/cuda-8.0/lib64 -Wl,-rpath,/usr/local/cuda-8.0/lib64 -lcudart -lcuda
并执行:
更多信息:
以这种方式使用 PGI OpenACC 运行时 API 是否安全?
Nvidia提供的CUDA运行时(通常在/usr/local/cuda
)和PGI提供的CUDA运行时(在我的例子中/usr/local/pgi/linux86-64/2017/cuda
)之间还有什么区别?我注意到它pgcc
从它自己的安装路径中使用 CUDA 7.5,但是当-ta=cuda8.0
提供它时,它使用/usr/local/cuda
. 有什么特殊原因吗?
c++ - 解释 PGI_ACC_TIME 输出
我有一些使用 PGI 编译器编译的 OpenACC 加速 C++ 代码。事情似乎很奏效,所以现在我想用分析信息来提高效率。
我通过设置生成一些时间信息:
然后运行程序。
以下输出结果:
它提出了一些问题:
我
time(us): 97,667
在顶部看到。这似乎是一个总时间,但在底部,我看到了real 0m3.864s
。为什么会有这样的差异?如果
time(us): 97,667
是总数,为什么它比较低的值小得多,例如elapsed time(us): total=680,216
?包括 ( ) 行的内核
elapsed time(us): total=680,216 max=1,043 min=654 avg=680
运行了 1000 次。最大值、最小值和平均值是否基于内核的每次运行值?由于
[grid]
和[block]
值可能会有所不同,经过的总值仍然是热点的良好指标吗?对于数据区域 (
device time(us): total=6,783
) 是测量传输时间还是处理数据所花费的全部时间(准备传输、接收后操作)?行号很奇怪。例如,我的程序中的第 76 行显然是一个
for
循环,第 95 行是一个右大括号,第 110 行是一个变量定义。行号应该被解释为“最接近指定行号的循环”,还是以其他方式?76 的内核包含 95 的内核。计算 76 的时间是否包括在 95 中花费的时间?如果是这样,是否有一种方便的方法可以找到在内核中花费的时间减去所有子内核的时间?
(其中一些问题有点难以理解,但我还没有找到这方面的文档,所以我想我会很彻底。)
profiling - 分析 OpenACC 和 CPU 代码
我正在试验一些针对 GPU 的 OpenACC 代码。
在我的实验中,我在 GPU 上运行部分代码,在 CPU 上运行其他部分。
问题在于推断这对性能的影响。使用PGI_ACC_TIME
,我可以获得有关循环在 GPU 上占用多长时间的信息,但尚不清楚如何将其与有关 CPU 的信息交错。
有没有办法交错来自 CPU 和 GPU 的时序信息?命令行实用程序是可取的,因为我的大多数会话都是远程的,但是使用 GUI 的方法可能还可以。
fortran - 在 Fortran 中 COMPILER_OPTIONS() 应该返回什么?
Fortran 2008 添加了一个名为 COMPILER_OPTIONS() 的新过程,根据GNU 文档,它应该返回一个带有用于编译文件的选项的字符串。根据Fortran 2003 status wiki,包括 GNU 和 PGI 在内的几乎所有编译器似乎都支持此功能。
我创建了一个COMPILER_OPTIONS.f08
如下所示的简单程序
这是我的gfortran
结果pgfortran
没有编译时选项的 Gfortran 5.4
编译时通过 -O3 的 Gfortran 5.4
PGI 17.4 在编译时没有传递任何选项
编译时通过 -O3 的 PGI 17.4
鉴于上述输出,我有以下问题
- 根据 Fortran 2008,预计返回的 COMPILER_OPTIONS() 过程是什么?
- 不同编译器的支持状态如何?
编辑:将标志从 -o3(输出文件 3)更改为 -O3(优化级别 3)。感谢 Pierre 和 francescalus 的反馈。
cuda - Nvidia 视觉分析器错误:无法创建分析文件
我是 nvprof 的新用户,当我尝试使用 nvprof 分析我的代码时出现错误。我在我的代码中添加了一些 OpenACC 指令。我使用的cuda工具包是Cuda8.0。我的代码是用 fortran90+OpenMPI 编写的。我使用 16 个内核进行并行计算。这是我用来提交代码的脚本:
该作业在运行几秒钟后终止,我收到以下错误消息:
生成了一个 nvprof.out 文件,但是当我使用命令“nvvp nvprof.out”检查它时没有显示任何内容。你以前遇到过这种情况吗?任何建议将不胜感激!