问题标签 [openacc]

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 回答
436 浏览

fortran - 使用 OpenACC 循环,每个线程是否都获得了标量的私有副本?

我有一个非常简单的代码片段:

当然,我可以x轻松地省略,但这是一个示例,x也是我的问题的重点,即:这里的每个线程是否自动获得自己的副本x,或者我应该将其声明为私有以防止各种线程崩溃它?

0 投票
1 回答
370 浏览

if-statement - OpenAcc if 条件不起作用?

我有以下代码:

kkk 被赋值为 1。
我发现 if 条件甚至没有运行,这意味着无论是真还是假,intersectionCount 都不会增加。

我的假设是,如果条件不能由 GPU/加速器处理。这是真的吗?
如果是真的,我能做些什么来处理这个问题?

ps 我对 GPU 编程非常陌生。

非常感谢

0 投票
1 回答
128 浏览

openacc - 如何运行不包含 CUDA 代码的 NVPROF?

想要在升级之前对不包含 cuda 代码的标准 fortran 代码进行基准测试。我可以这样做吗?如果可以,怎么做?

0 投票
1 回答
195 浏览

pragma - OpenACC 数据移动

我对 OpenACC 很陌生,我不太了解数据移动和“#pragma acc data”子句。

我有一个用 C 编写的程序。代码的摘录是这样的:

intersectionsCount 的值为 210395。通过以下方式编译并运行上述代码后:

我有这个输出:

阅读输出后我有一些问题:

  1. 我不知道为什么它说第 31 行,因为第 31 行没有 acc pragma。这是否意味着我无法追踪的东西?
  2. 在“31:内核启动210395次”行中,它表示它启动了210395次内核。我不知道内核需要启动这么多次是否正常,因为这部分花了5,451,647(us),我认为它有点长。我认为for循环很简单,不应该花太多时间。我是否以错误的方式使用了编译指示?

更新
我确实有几个程序的头文件。但是这些文件没有“acc data”或“acc kernels”编译指示。

使用“-Minfo=all”编译代码后,结果如下:

我以这种方式创建intersectionSet:

0 投票
1 回答
2337 浏览

cuda - 什么会导致 nvprof 不返回数据?

我有一个使用 OpenACC 检测的 Fortran MPI 代码。这是一个大代码。我无法在这里提供任何有意义的片段。它在 Cray aprun 下运行良好:

我想用 nvprof 来分析它。我尝试:

代码再次运行正常,但是当一切都说完了,我没有得到任何分析数据,只有一条消息:

没有提供其他错误消息。任何人都知道什么会导致这种行为?我正在使用 Cray MPI Fortran 编译器进行编译。我的编译标志是

模块已cudatoolkit加载。

0 投票
1 回答
318 浏览

fortran - 带 MPICH 的 nvprof

我正在尝试分析 MPI/OpenACC Fortran 代码。我在这里找到了一个详细说明如何使用 MPI 运行 nvprof 的站点。给出的示例适用于 OpenMPI。但是,我仅限于 MPICH,我无法弄清楚等价物。有谁知道会是什么?

0 投票
1 回答
290 浏览

gcc - GCC 是否具有与 pgcc 的 -Minfo=accel 类似的参数?

我正在尝试在使用 OpenACC 卸载到 NVIDIA GPU 的 GCC 上编译代码,但我无法找到与上述编译器类似的编译器选项。有没有办法告诉 GCC 在与卸载相关的所有操作上更加详细?

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 投票
1 回答
1180 浏览

gcc - What it takes to make OpenACC/OpenMP4.0 offloading to nvidia/mic work om GCC?

I am trying to understand how exactly I can use OpenACC to offload computation to my nvidia GPU on GCC 5.3. The more I google things the more confused I become. All the guides I find, they involve recompiling the entire gcc along with two libs called nvptx-tools and nvptx-newlib. Other sources say that OpenACC is part of GOMP library. Other sources say that the development for OpenACC support will continue only on GCC 6.x. Also I have read that support for OpenACC is in the main brunch of GCC. However if I compile a program with -fopenacc and -foffload=nvptx-non is just wont work. Can someone explain to me what exactly it takes to compiler and run OpenACC code with gcc 5.3+?

  • Why some guides seem to require (re)compilation of nvptx-tools, nvptx-newlib, and GCC, if, as some internet sources say, OpenACC support is part of GCC's main branch?
  • What is the role of the GOMP library in all this?
  • Is it true that development for OpenACC support will only be happening for GCC 6+ from now on?
  • When OpenACC support matures, is it the goal to enable it in a similar way we enable OpenMP (i.e., by just adding a couple of compiler flags)?
  • Can someone also provide answers to all the above after replacing "OpenACC" with "OpenMP 4.0 GPU/MIC offload capability"?

Thanks in advance