问题标签 [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 投票
0 回答
202 浏览

c - 从 PGCC 编译的 OpenACC 加速共享库调用例程时,MEX 中出现未定义符号错误

我有一个libraberto.soPGCC. 它包含 OpenACC pragma 指令,并使用-acc标志编译以确保启用这些指令。对应的makefile规则为:

其中file1.c,file2.c等是构成库的源文件。

然后我有一个mex_gateway.c文件,它简单地从 MATLAB 调用共享库中的一个例程,将变量(数组和标量)传递给它,然后接收输出数组。它编译如下:

编译工作正常,但是当我尝试在 MATLAB 中运行网关时,出现以下错误:

我无法在 Google 上找到有关此特定错误(符号)的任何信息,并且不确定在哪里查看我的代码。该程序在编译没有 OpenACC 指令(即没有-acc)的共享库时运行良好。我认为该错误可能是由于 MEX ( mxArray) 使用的数组的特殊性质造成的,当将数据传输到加速器时,它可能与 OpenACC 不兼容,但是memcpy在将输入传递给真正malloc的 C 数组之前将它们传递给共享库例程没有区别。

0 投票
1 回答
399 浏览

c++ - 使用 OpenACC 设置设备内存中变量的值

为什么下面的代码不允许我var通过10函数设置intfun

汇编:

执行:

如何在设备上intfun设置参数值int var

0 投票
1 回答
477 浏览

c++ - 外部函数如何使用设备内存中的变量?

在这段代码中:

如何int value识别在设备内存中intfun?如果我在编译指示中替换present(variable[:1])为,我会收到以下运行时错误:present(variable[:1],value)intfun

我不明白为什么指定它valuepresent导致上述失败。我检查了value仅在指令中复制一次的NVVP enter data,即它不会parallelintfun. OpenACC 如何发挥它的魔力?

0 投票
1 回答
2726 浏览

c++ - OpenACC 减和输出在每次执行时递增总和

为什么下面的代码:

每次执行都返回不同的结果?

根据 OpenACC 标准:

在退出数据指令上,数据被复制回本地内存并被释放。

看起来它sum没有被释放,而是在程序的每次运行时重新使用(并增加)。此外,指令中的+运算符reduction将归约变量初始化为0,因此即使sum没有在执行之间释放,也不应该发生这种情况。

我可以通过在指令中使用copyin而不是createfor来避免这种行为,或者在单个 gang、单个工作内核中设置:sumenter datasum = 0

但这并不令人满意,因为它需要昂贵的主机到设备数据复制,或者内核启动。为什么我的程序会这样?

0 投票
0 回答
319 浏览

c++ - 推动主机和设备之间的数据传输?

这是重现无法解释的行为的代码:

主文件

findme.cu

有一个 1 字节的设备到主机传输(我猜 8 字节设备到主机的传输是position int,但为什么是 8 个字节而不是 4 个?)...

在此处输入图像描述

...和一台主机到设备的 4 字节传输...

在此处输入图像描述

...我无法解释。请注意,ARRAY屏幕截图中看不到复制的内容,但包含在主机到设备传输(40 字节)的详细信息选项卡中。关于准确传输哪些数据的任何线索?它们是推力算法所固有的,因此是不可避免的吗?

0 投票
1 回答
68 浏览

openacc - OpenACC 边界问题

我在 OpenACC 中做了一个非常简单的向量加法内核。而且我想知道这是否是我正在使用的编译器的问题(accULL with OpenCL),因为我遇到了问题,似乎将数据从设备复制回主机。所有结果都是正确的,但结果 [0]。例如以下代码:

返回以下内容:

这意味着除了索引 0 处的结果之外的所有结果都是正确的,似乎索引 0 的结果没有从设备复制过来。

这是一个编译器/运行时错误还是我错过了一些关于我的编码的东西?

0 投票
2 回答
891 浏览

cuda - GPU 上的强大扩展能力

我想研究我的并行 GPU 代码(用 OpenACC 编写)的强大扩展性。使用 GPU 进行强大扩展的概念——至少据我所知——比使用 CPU 更模糊。我发现的关于 GPU 强大扩展的唯一资源建议修复问题大小并增加 GPU 的数量。然而,我相信在GPU中存在一定程度的强大扩展,例如通过流式多处理器(在 Nvidia Kepler 架构中)进行扩展。

OpenACC 和 CUDA 的目的是明确地将硬件抽象给并行程序员,将她限制在他们的三级编程模型中,包括 gangs(线程块)、workers(warp)和vectors(SIMT 线程组)。据我了解,CUDA 模型旨在为其线程块提供可扩展性,这些线程块是独立的并映射到 SMX。因此,我看到了两种研究使用 GPU 进行强大扩展的方法:

  1. 修复问题大小,并将线程块大小和每个块的线程数设置为任意常数。缩放线程块的数量(网格大小)。
  2. 给定关于底层硬件的额外知识(例如 CUDA 计算能力、最大扭曲/多处理器、最大线程块/多处理器等),设置线程块大小和每个块的线程数,以便一个块占用整个和单个 SMX。因此,在线程块上进行缩放等同于在 SMX 上进行缩放。

我的问题是:我关于 GPU 上的强缩放的思路是否正确/相关?如果是这样,有没有办法在 OpenACC 中执行上述 #2?

0 投票
3 回答
261 浏览

gpgpu - OpenACC 2.0 例程:数据局部性

以下面的代码为例,它说明了在加速器上调用一个简单的例程,使用 OpenACC 2.0 的routine指令在设备上编译:

如何function知道使用设备副本ARRAY[0:10]以及multiplier何时从并行区域内调用它?我们如何强制使用设备副本?

0 投票
1 回答
149 浏览

cuda - 验证存在缓存指令时使用 NVIDIA __shared__ 内存

我正在使用 PGI 14.10 试验 OpenACC 的缓存子句。我有一个基于 [1] 幻灯片中的简单循环:

当我在 nvprof 下使用 --metrics shared_load_transactions,shared_store_transactions 运行它时,它报告没有加载或存储。那么缓存指令是否没有我想要的效果(如果有,为什么它不起作用)?还是使用 nvprof 来衡量共享事务不正确?

Minfo 输出如下。

[1] http://www.pgroup.com/lit/presentations/cea-3.pdf

0 投票
4 回答
19918 浏览

multithreading - Can OpenMP be used for GPUs?

I've been searching the web but I'm still very confused about this topic. Can anyone explain this more clearly? I come from an Aerospace Engineering background (not from a Computer Science one), so when I read online about OpenMP/CUDA/etc. and multithreading I don't really understand a great deal of what is being said.

I'm currently trying to parallelize an in-house CFD software written in FORTRAN. These are my doubts:

  1. OpenMP shares the workload using multiple threads from the CPU. Can it be used to allow the GPU to get some of the work too?

  2. I've read about OpenACC. Is it similar to OpenMP (easy to use)?

I've also read about CUDA and kernels, but I don't have any much experience in parallel programming and I don't have the faintest idea of what a kernel is.

  1. Is there an easy and portable way to share my workload with the GPU, for FORTRAN (if OpenMP doesn't do that and OpenACC is not portable)?

Can you give me a "for dummies" type of answer?