问题标签 [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.
fortran - 使用 OpenACC 循环,每个线程是否都获得了标量的私有副本?
我有一个非常简单的代码片段:
当然,我可以x
轻松地省略,但这是一个示例,x
也是我的问题的重点,即:这里的每个线程是否自动获得自己的副本x
,或者我应该将其声明为私有以防止各种线程崩溃它?
if-statement - OpenAcc if 条件不起作用?
我有以下代码:
kkk 被赋值为 1。
我发现 if 条件甚至没有运行,这意味着无论是真还是假,intersectionCount 都不会增加。
我的假设是,如果条件不能由 GPU/加速器处理。这是真的吗?
如果是真的,我能做些什么来处理这个问题?
ps 我对 GPU 编程非常陌生。
非常感谢
openacc - 如何运行不包含 CUDA 代码的 NVPROF?
想要在升级之前对不包含 cuda 代码的标准 fortran 代码进行基准测试。我可以这样做吗?如果可以,怎么做?
pragma - OpenACC 数据移动
我对 OpenACC 很陌生,我不太了解数据移动和“#pragma acc data”子句。
我有一个用 C 编写的程序。代码的摘录是这样的:
intersectionsCount 的值为 210395。通过以下方式编译并运行上述代码后:
我有这个输出:
阅读输出后我有一些问题:
- 我不知道为什么它说第 31 行,因为第 31 行没有 acc pragma。这是否意味着我无法追踪的东西?
- 在“31:内核启动210395次”行中,它表示它启动了210395次内核。我不知道内核需要启动这么多次是否正常,因为这部分花了5,451,647(us),我认为它有点长。我认为for循环很简单,不应该花太多时间。我是否以错误的方式使用了编译指示?
更新
我确实有几个程序的头文件。但是这些文件没有“acc data”或“acc kernels”编译指示。
使用“-Minfo=all”编译代码后,结果如下:
我以这种方式创建intersectionSet:
cuda - 什么会导致 nvprof 不返回数据?
我有一个使用 OpenACC 检测的 Fortran MPI 代码。这是一个大代码。我无法在这里提供任何有意义的片段。它在 Cray aprun 下运行良好:
我想用 nvprof 来分析它。我尝试:
代码再次运行正常,但是当一切都说完了,我没有得到任何分析数据,只有一条消息:
没有提供其他错误消息。任何人都知道什么会导致这种行为?我正在使用 Cray MPI Fortran 编译器进行编译。我的编译标志是
模块已cudatoolkit
加载。
fortran - 带 MPICH 的 nvprof
我正在尝试分析 MPI/OpenACC Fortran 代码。我在这里找到了一个详细说明如何使用 MPI 运行 nvprof 的站点。给出的示例适用于 OpenMPI。但是,我仅限于 MPICH,我无法弄清楚等价物。有谁知道会是什么?
gcc - GCC 是否具有与 pgcc 的 -Minfo=accel 类似的参数?
我正在尝试在使用 OpenACC 卸载到 NVIDIA GPU 的 GCC 上编译代码,但我无法找到与上述编译器类似的编译器选项。有没有办法告诉 GCC 在与卸载相关的所有操作上更加详细?
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
难道我做错了什么?以上步骤正确吗?
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