【问题标题】:OpenACC shared memory usageOpenACC 共享内存使用
【发布时间】:2015-08-21 02:08:03
【问题描述】:

我正在使用 pgi 编译器处理 openacc。我想知道如何在运行时分析有关内存使用情况的代码,特别是共享内存?

非常感谢您的帮助!

贝扎德

【问题讨论】:

  • 你指的是哪个共享内存? OpenACC specification 主要使用“共享内存”来区分两种类型的加速器: 1. 主机和设备内存共享的加速器称为“共享内存加速器” 2. 主机和设备内存分开的加速器 - “非共享内存加速器”?或者您的意思是“CUDA 定义的共享内存?或者您的意思是 OpenCL 2.0 共享虚拟内存?
  • 感谢您的回复。我的意思是 CUDA 意义上的共享内存。缓存在 OpenACC 中的那个(!$acc 缓存)

标签: shared-memory profiler openacc


【解决方案1】:

我假设您的意思是 CUDA 意义上的“共享内存”(NVIDIA GPU 上的快速、每个 SM 共享内存)。在这种情况下,您有几个选择。

首先,如果您只想知道使用了多少共享内存,可以在编译时通过添加-Mcuda=ptxinfo 来确定。

pgcc -fast -ta=tesla:cc35 laplace2d.c -Mcuda=ptxinfo
ptxas info    : 0 bytes gmem
ptxas info    : Compiling entry function 'main_61_gpu' for 'sm_35'
ptxas info    : Function properties for main_61_gpu
    0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 26 registers, 368 bytes cmem[0]
ptxas info    : Compiling entry function 'main_65_gpu_red' for 'sm_35'
ptxas info    : Function properties for main_65_gpu_red
    0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 18 registers, 368 bytes cmem[0]
ptxas info    : Compiling entry function 'main_72_gpu' for 'sm_35'
ptxas info    : Function properties for main_72_gpu
    0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 18 registers, 344 bytes cmem[0]

在上述情况下,我似乎没有使用任何共享内存。 (跟进我与一位 PGI 编译器工程师交谈,得知共享内存是在内核启动时动态调整的,因此不会通过 ptxinfo 显示。)

您还可以使用 NVIDIA Visual Profiler 来获取此信息。如果您收集 GPU 时间线,然后单击特定内核的实例,属性面板应打开并显示共享内存/块。在我的例子中,上面显示使用了 0 字节的共享内存,而 Visual Profiler 显示正在使用一些内存,所以我需要深入研究原因。

您也可以在运行时获取一些信息。如果您对命令行感到满意,可以使用 nvprof:

# Analyze load/store transactions
$ nvprof -m shared_load_transactions,shared_store_transactions ./a.out
# Analyze shared memory efficiency
# This will result in a LOT of kernel replays.
$ nvprof -m shared_efficiency ./a.out

这不会显示使用的数量,但可以让您了解它的使用方式。 Visual Profiler 的引导式分析将让您深入了解这些指标的含义。

【讨论】:

  • 非常感谢 Jeff 提供的详细信息。我检查了代码,没有共享内存(缓存)使用。但是,当我为内部循环中的一个向量添加 !$acc 缓存时,性能会下降(计算时间增加而 GFLOP 减少)。我知道如何在 CUDA 中实现共享内存,但我不知道如何在 OpenACC 中有效地实现它。
  • 我有时看到的一件事是,如果我使用kernels 指令,编译器有时会自动将缓存添加到代码中(您可以在-Minfo 消息中看到它) ,但如果您使用parallel loop,则通常必须明确使用cache 指令。如果您的数组在 gang 循环中是私有的,那么您更有可能缓存这些数组(并且更有可能使 cache 指令正常工作)。
  • 如果您在编写 OpenACC 时考虑到了 CUDA 内核,尤其是当您想要实现这些较低级别的优化时,这可能会非常令人沮丧。请参阅我之前关于使cache 工作的技巧的评论。有时,使用 OpenACC 进行优化可能有点手忙脚乱,有很多猜测和手指交叉。我们正在努力让它变得更好。
  • 谢谢杰夫。我实际上正在寻找一些文档来帮助我在 openacc 代码中显式(手动)使用共享内存。如果您为我介绍此案例的一些资源,我将不胜感激。
  • 你是对的,缓存指令没有很好的文档记录,使用起来可能很神秘。我会看看能否找到可以帮助您解决后续问题的人。
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2014-10-08
  • 2014-04-20
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
相关资源
最近更新 更多