问题标签 [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.

0 投票
1 回答
936 浏览

c++ - 未生成 OpenACC 并行内核

我正在 PGC++ 上开发代码以图形化地加速代码。

  • 我正在使用具有 Eigen 依赖性的 OpenBabel。
  • 我试过使用#pragma acc kernel
  • 我尝试过使用#pragma acc 例程
  • 我的编译命令是:“pgc++ -acc -ta=tesla -Minfo=all -I/home/pranav/new_installed/include/openbabel-2.0/ -I/home/pranav/new_installed/include/eigen3/ -L/home/ pranav/new_installed/lib/openbabel/main.cpp /home/pranav/new_installed/lib/libopenbabel.so"

我收到以下错误

注意:第 66 行是“mol.SetTorsion(a[0],a[1],a[2],a[3],i*(3.14159265358979323846/180));” 在下面粘贴的预兆中。

我显示此错误的代码如下:

从谷歌的主要搜索中,我知道这是由于 mol(OBMol 对象)的“反向依赖”而发生的错误。如果有人知道它的解决方案,请帮助我。

0 投票
0 回答
338 浏览

fortran - PGI 相当于“使用 ifcore”与英特尔编译器

我目前正在使用最初为英特尔编译器设计的 PGI 编译模型。其中一个脚本使用use ifcore的是一个特定于 Intel 的命令,它链接到各种运行时库中。我很难找到 PGI 等价物(对于 linux 机器)......有什么想法吗?

我正在查看,dflib但这似乎是特定于 Windows 的。我目前正在使用 mpif90 编译模型。

0 投票
1 回答
755 浏览

c - 在 C 中手动深度复制到设备

我正在尝试并行化一个使用 openACC 进行一些图像处理的程序。作为此处理的一部分,我定义了一个自定义结构,类似于:

我在一个数组中访问它Deep *structPointer

我遇到了一些手动将整个内容复制structPointer到 GPU 的文档,这给我留下了以下代码。

这一切都运行良好,直到我尝试运行一个并行 for 循环,该structPointer循环property根据RGB *image.

伪代码:

我得到:

调用 cuStreamSynchronize 返回错误 700:内核执行期间地址非法

的输出cuda-memcheck是:

请注意,程序在没有 openACC 的情况下编译时运行,并且在单线程中运行时将正确处理。

0 投票
1 回答
2989 浏览

bash - Bash 错误 - 预期二元运算符

我正在尝试安装 PGI Compilers 2016,运行install文件后出现错误:

在线上:

ShellCheck.net说“添加双引号以防止通配符和分词”无论它是什么意思。

但是整个安装套件非常大,所以我应该在无数地方添加引号还是有一些命令可以用来绕过它?

0 投票
1 回答
49 浏览

openacc - OpenACC 编译器是否必须进行依赖性分析?

许多 OpenACC 教程假定编译器/加速器将通过自动检查依赖关系并确保循环实际上是可并行化的来检查正确性。然而,OpenACC 规范似乎没有提及强制正确性分析的任何内容。OpenACC 编译器是否有义务检查循环是否实际上是可并行化的,如果不是则放弃?

0 投票
1 回答
1358 浏览

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 中的许多其他工具(如pgacclnknvlink)。


我的问题:

  1. 我走错路了吗?我可以从 GCC 调用 PGI 编译库中的函数并在这些函数中使用 OpenACC 吗?
  2. 如果上面的答案是肯定的,我可以使用没有PGI 采取的步骤(调用pgacclnk和)的仍然链接吗?nvlink
  3. 如果上面的答案也是肯定的,我该怎么办?
0 投票
1 回答
436 浏览

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


难道我做错了什么?以上步骤正确吗?

0 投票
0 回答
50 浏览

arrays - PGI FORTRAN90 分配传递给子程序的数组(段错误)

这是我使用 PGI fortran 编译器编译的一些 fortran90 代码。arraySub()如果没有段错误,我似乎无法在子例程中分配数组。如果我什至检查数组是否像这样分配,它也会出现段错误allocated(theArray):我正在像这样在命令行上编译代码:pgf90 -o test.exe test.f90

我很困惑为什么在子例程theArray中不可分配,arraySub因为我用intent(inout)and初始化它allocatable。特别奇怪的是,allocated(theArray)还有段错误。我想知道是否有人可以为我指出正确的解决方案。提前致谢!

编辑:由于重复问题中没有实际的示例代码,我将使用模块发布解决方案:

0 投票
1 回答
458 浏览

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?

0 投票
2 回答
504 浏览

c - openACC 传递结构列表

我有一个 C 程序来查找 2 组多边形是否重叠。用户输入 2 组多边形(每组数据有数千个多边形),程序查看 set1 中的哪个多边形与 set2 中的哪个多边形重叠

我有2个这样的结构:

我有以下代码段:

listOfPolygons1 和 listOfPolygons2 (顾名思义)是一个 gpc_vertex_list 数组。listOfBoolean 是一个 int 数组。
检查 2 个多边形的 mbr 以查看它们是否重叠,如果是,函数“isRectOverlap”返回 1,如果不是,则返回 0,并将值放入 listOfBoolean

问题
代码可以编译但不能运行。它返回以下错误:

我的观察
该程序可以通过将第 115 行更改为以下内容来编译和运行:

或这个:

(虽然结果是错误的,但至少,它可以运行)

问题
如果值没有从“isRectOverlap”传递到“listOfBoolean”,“isRectOverlap”和“listOfBoolean”似乎都不会产生问题
有谁知道如果我将“isRectOverlap”的返回值分配给“ listOfBoolean”?

isRectOverlap 函数是这样的:

程序不在OpenACC中运行时没有问题

感谢您的帮助