问题标签 [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.
cuda - PGI 加速器 Fortran 代码中的错误
这是我的代码
我正在使用 PGI 加速器指令进行并行化,但它显示
“编译器无法转换加速器区域(请参阅 -Minfo 消息):具有零步长值的感应变量”
cuda - OpenACC:复杂循环对“*(*(b))”的依赖阻止了并行化
我正在使用具有动态数组分配的 OpenACC。以下是我的分配方式:
这是我如何并行矩阵添加:
当我用它编译这段代码时,pgcc
它会检测循环迭代上对指针的依赖float**
并生成所有标量内核(每块 1 个块 1 个线程),其性能不如预期:
循环显然是并行的,我认为编译器也可以检测到这一点。我很好奇如何解释它pgcc
?
提前致谢。
fortran - 运行更大规模的程序时出现 OpenACC 错误
使用以下代码,是否正确?我有 2GB Geforce 750M 并使用 PGI Fortran 编译器。该程序适用于4000x4000
数组,即使它不应该抱怨任何更高的东西,你可以看到我已经分配了一个9000x9000
数组但是如果我使用一个值> 4000它会抱怨并引发运行时错误。
cuda - PGI openACC:目标特定的 gpu 设备
我有两张 NVIDIA 卡:
使用 pgcc,我如何定位特定的卡?如何确保为 nvidia0 (device=0) 或 nvidia1 (device=1) 生成代码?
预先感谢您的帮助。
bash - Bash 错误 - 预期二元运算符
我正在尝试安装 PGI Compilers 2016,运行install
文件后出现错误:
在线上:
ShellCheck.net说“添加双引号以防止通配符和分词”无论它是什么意思。
但是整个安装套件非常大,所以我应该在无数地方添加引号还是有一些命令可以用来绕过它?
openacc - OpenACC 编译器是否必须进行依赖性分析?
许多 OpenACC 教程假定编译器/加速器将通过自动检查依赖关系并确保循环实际上是可并行化的来检查正确性。然而,OpenACC 规范似乎没有提及强制正确性分析的任何内容。OpenACC 编译器是否有义务检查循环是否实际上是可并行化的,如果不是则放弃?
gcc - c - 将启用 PGI OpenACC 的库与 gcc 链接
简而言之,我的问题依赖于使用两个不同的编译器编译/构建文件(使用库),同时利用源文件中的 OpenACC 结构。
我有一个具有 OpenACC 结构的 C 源文件。它只有一个简单的函数来计算数组的总和:
我可以使用以下行轻松编译它:
pgcc -acc -ta=nvidia -c libmyacc.c
然后,通过以下行创建一个静态库:
ar -cvq libmyacc.a libmyacc.o
为了使用我的库,我编写了一段代码,如下所示:
现在,我可以使用这个带有 PGI 编译器本身的静态库来编译上面的源代码(f1.c
):
pgcc -acc -ta=nvidia f1.c libmyacc.a
它将完美地执行。但是,对于 gcc,它有所不同。我的问题就在这里。如何使用 gcc 正确构建它?
感谢 Jeff 对这个问题的评论:
使用 gcc 链接器链接 pgi 编译库,现在我可以f1.c
无错误地构建我的源文件 (),但可执行文件会发出一些致命错误。
这是我用 gcc ( f1.c
) 编译我的源文件的方法:
gcc f1.c -L/opt/pgi/linux86-64/16.5/lib -L/usr/lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L. -laccapi -laccg -laccn -laccg2 -ldl -lcudadevice -lpgmp -lnuma -lpthread -lnspgc -lpgc -lm -lgcc -lc -lgcc -lmyacc
这是错误:
感谢使用 PGI 编译器编译-v
时的选项f1.c
,我看到编译器调用了 PGI 和 NVidia 中的许多其他工具(如pgacclnk
和nvlink
)。
我的问题:
- 我走错路了吗?我可以从 GCC 调用 PGI 编译库中的函数并在这些函数中使用 OpenACC 吗?
- 如果上面的答案是肯定的,我可以使用没有PGI 采取的步骤(调用
pgacclnk
和)的仍然链接吗?nvlink
- 如果上面的答案也是肯定的,我该怎么办?
gcc - c - 将启用 PGI OpenACC 的库与 gcc 动态链接
之前,我问了一个关于使用 PGI 创建静态库并将其链接到使用 gcc 构建的程序的问题:c - Linking a PGI OpenACC-enabled library with gcc
现在,我有同样的问题,但动态。当我的库是使用 PGI动态构建的时,如何使用 gcc 构建程序?
而且,考虑到以下事实:
我也希望他们都能够识别相同的 OpenMP 编译指示和例程。例如,当我在库中使用 OpenMP 临界区时,整个程序应该在该部分进行序列化。
OpenACC pragma 用于使用 PGI 构建的库中。
在我的应用程序中完全动态加载库。我的意思是
dlopen
用来打开库和dlsym
查找函数。我还希望我的线程能够同时访问 GPU 进行数据传输和/或计算。有关更多详细信息,请参阅以下代码片段。
例如,构建以下库和主代码会发出此错误:call to cuMemcpyHtoDAsync returned error 1: Invalid value
注意:在构建以下代码时,我有意使用 LibGOMP ( -lgomp
) 而不是 PGI 的 OpenMP 库 ( -lpgmp
) 用于 lib 和 main 两种情况。
库代码:
使用以下命令构建库:
pgcc -acc -ta=nvidia:nordc -fPIC -c libmyacc.c
pgcc -shared -Wl,-soname,libctest.so.1 -o libmyacc.so -L/opt/pgi/linux86-64/16.5/lib -L/usr/lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -laccapi -laccg -laccn -laccg2 -ldl -lcudadevice -lgomp -lnuma -lpthread -lnspgc -lpgc -lm -lgcc -lc -lgcc libmyacc.o
主要代码:
并使用我之前的问题中 Mat 描述的 gcc 使用以下命令构建我的主代码:
gcc f1.c -L/opt/pgi/linux86-64/16.5/lib -L/usr/lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L. -laccapi -laccg -laccn -laccg2 -ldl -lcudadevice -lgomp -lnuma -lpthread -lnspgc -lpgc -lm -lgcc -lc -lgcc -lmyacc
难道我做错了什么?以上步骤正确吗?
alias - openacc - alias for an array results in "Cannot determine bounds for array" error
I have an array of size N on my host. I will transfer it to my device and then I try to assign an alias to it and use that. But, I get a "Cannot determine bounds for array" compilation error.
Example:
Above code will result in following error:
PGC-S-0155-Cannot determine bounds for array br (array.c: 15)
Even, if I try to be more specific and try this double *br = &ar[0];
, the same thing happens.
I am using PGI 16.5 64-bit version with CUDA 7.5 on a cc20 device.
Since I am using a valid array, the aliasing should not be a problem, right? Is this a bug?
arrays - 在 OpenACC 中加入数组结果
我正在编写一个具有数组依赖性的 OpenACC 代码。内循环的每次迭代都可以更新数组的相同位置。这是一些代码:
OpenMP 版本的写法如下:
在 OpenACC 中,关键字 private 与数组一起使用,但我不知道如何将私有数组与全局数组连接起来。
谢谢。