问题标签 [pgi-accelerator]
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.
gcc - OpenMP/OpenACC 实现和 gcc/PGI 编译器之间的结果差异
我有一个更大的 Fortran 程序,我正在尝试转换它,以便计算密集型部分将在使用 OpenMP 和/或 OpenACC 的 NVidia GPU 上运行。在开发过程中,我遇到了一些问题,以了解如何在 GPU 上执行的子例程中使用模块中声明的变量(其中一些也在 CPU 上)。因此,我创建了一个小示例,并通过试验和添加相应的 OpenMP 和 OpenACC 指令来解决这个问题。我在此消息的末尾包含了构成我的示例的三个文件。
正如我认为我已经理解了一些事情并且我的示例程序可以工作一样,我注意到以下内容:
- 我使用 OpenMP 指令使用 gcc 10.2 编译程序:
结果与预期一致,即数组 XMO 的所有元素都是 1,DCP 的所有元素都是 2,IS1 的元素是 3,IS2 的元素是 24。
- 我使用 OpenACC 指令使用 PGI 编译器 19.10 社区版编译程序:
结果与上述相同。
- 我使用 OpenACC 指令使用 gcc 10.2 编译程序:
数组 XMO、DCP 和 IS1 的结果是正确的,但是 IS2 的所有元素都是 0。很容易验证变量 NR 的值为 0 来得到这个结果。
我的理解是,我的示例的 OpenMP 和 OpenACC 版本是等效的,但我无法弄清楚为什么 OpenACC 版本仅适用于 PGI 编译器而不适用于 gcc。
如果可能,请提供不需要更改代码而只需要更改指令的解决方案。正如我所提到的,我的原始代码要大得多,包含更多的模块变量,并在代码中调用更多的子例程以在 GPU 上执行。更改该代码将变得更加困难,显然我宁愿仅在确实有必要时才这样做。
先感谢您!
我的示例文件如下。
openacc - acc并行区域内的例程
在阅读了这个how-can-a-fortran-openacc-routine-call-another-fortran-openacc-routine之后,我仍然对这个 OpenACC 函数调用限制感到困惑。
以下是来自上述链接帖子的修改后的废话代码:
当我用nvfortran
20.7 版本编译它时,我得到了
是什么触发了编译错误?作为比较,以下代码与 acc 函数调用
可以用 OpenACC 编译并运行。
更新:令人惊讶的是,对于第一段代码,当我简单地切换子程序的顺序时,它起作用了:
令我惊讶的是,这个特定的依赖于常规订购。但是为什么它适用于我上面的第二个例子呢?
openacc - OpenACC 第一个私有变量
我在 OpenACC 内核中遇到了数组问题。这是演示代码:
当我编译nvfortran -acc -Minfo=accel test.f90
并运行它时,它显示在设备上数组中的值是 0.0,而不是我在主机端设置的正确值 1.0。这仅适用于数组:标量,如示例中所示,具有正确的值。
我想知道这是否是nvfortran
当前 OpenACC 标准或当前 OpenACC 标准的限制?
pgi - PGI 编译器的未知库
我已经为加速器(20.9)安装了 PGI 编译器,但是一个应用程序的编译找不到 3 个库nvhpcatm.so
,nvcpumath.so
& nvc.so
。我想知道是否有人熟悉这些库中的任何一个或者它们应该如何构建。谢谢。
fortran - Fortran-OpenACC 包含的子程序如何从父子程序访问数据
我目前正在加速 Fortran 代码,其中包含的子例程 ( subsub
) 访问和修改父子例程 ( sub
) 中声明的变量:
使用 PGI 编译器版本 20.9-0 编译时,它抱怨subsub
无法引用主机变量var
:
这是有道理的。我尝试使用orvar
在设备上创建,但它不会改变结果。acc data create(var)
acc declare create(var)
这种模式可以加速吗?
fortran - 带有意图输出参数的 OpenACC 例程向量
我目前正在加速 Fortran 代码,其中我在 subroutine 中有一个主要的加速循环sub
。在循环中,我想subsub
在设备上调用子程序acc routine
。子例程有一个intent(out)
参数val
,它在循环中是私有的。与subsub
循环本身一样,我想使用该vector
子句:
使用 PGI 编译器版本 20.9-0 编译并运行程序时,我在 variable 中得到乱码值array
。当我简单地使用acc routine
forsubsub
时,我得到了正确的行为(在 的所有值中为 10 array
)。我并行化这个子例程的方法有什么问题?
nvcc - 获取 OpenACC 空闲(或总)设备内存
我有一个 GPU 代码,它在每次迭代时决定是否可以将迭代卸载到加速器。OpenACC 成为最好的工具:
我如何提前决定是否aos[0:n_aos]
适合 GPU 内存?有openacc_get_free_device_memory()
某种功能吗?
否则,如果出现内存不足故障,我如何启动设备复制并返回仅 CPU 运行?
fortran - OpenACC Fortran 循环中的 Matmul
使用 PGI 编译器使用 OpenACC 加速 Fortran 代码,我遇到matmul
了加速循环中的调用问题。
在简化示例中,我将单位矩阵应用于两个向量,因此输入和输出值应该相同:
使用 PGI 编译器 20.9 版进行编译时,我得到了以下信息:
运行代码会给出以下值:
第二行应该和第一行一样,顺序执行就是这种情况。代码有什么问题?
fortran - OpenACC Fortran 循环中的顺序点积
在 Fortran 程序中,我有一个大循环,其中dot_product
对循环内生成的小向量进行了多次调用:
当使用 PGI 编译器编译时,似乎加速实现dot_product
使用加速循环,因此可以防止更好地加速主循环(在 gang 和 vector 上):
从日志中可以看出,它对循环私有向量使用隐式缩减和共享内存。
有没有办法强制dot_product
顺序运行?
openacc - 简单 OpenACC 内核中向量子句的非法上下文
我正在尝试编译一个简单的 OpenACC 基准测试:
使用 Nvidia HPC SDK 21.5 并遇到错误
知道是什么原因造成的吗?据我所知,我的语法vector(128)
是合法的。