【问题标题】:Selective nvidia #pragma optionNV(unroll all)选择性 nvidia #pragma optionNV(全部展开)
【发布时间】:2013-12-06 04:10:35
【问题描述】:

我正在使用 nvidia 的 unroll loops 指令,但还没有看到有选择地打开它的方法。

假设我有这个......

void testUnroll()
{
    #pragma optionNV(unroll all)
    for (...)
        ...
}

void testNoUnroll()
{
    for (...)
        ...
}

在这里,我假设两个循环最终都被展开。为了阻止这种情况,我认为解决方案将涉及在我想要影响的块之后重置指令,例如:

    #pragma optionNV(unroll all)
    for (...)
        ...
    #pragma optionNV(unroll default) //??

但是我不知道将展开行为重置为初始/默认设置的关键字。 如何做到这一点?如果有人还可以指出一些有关 nvidia 编译器指令的官方文档,那就更好了。


目前,似乎只使用了程序中找到的最后一个#pragma optionNV(unroll *) 指令(例如,在最后一行抛出一个,它会覆盖它上面的所有内容)。

【问题讨论】:

    标签: opengl glsl nvidia


    【解决方案1】:

    根据 NVidia 论坛上的this post,之后没有关键字会将其设置为默认行为:

    #pragma unroll 1 将阻止编译器展开循环。

    如果在#pragma unroll 之后没有指定数字,则如果它的行程计数恒定,则循环完全展开,否则根本不展开。

    我不确定它是否适用于 GLSL,但你可以试试:

    #pragma optionNV(unroll)
    

    如果有人尝试过,请告诉我们它是否有效!

    【讨论】:

    • 感谢您的参考。但是,默认行为会将循环展开到某个阈值(尽管我不确定这是什么)。我得到的主要问题是,至少在 2013 年,我不能仅将指令应用于某个代码块而不是其余代码块——它是全局的。其实我只是在发布后才意识到,因此更新。
    【解决方案2】:

    我不记得我在哪里找到的,但我可以确认这适用于带有 435 驱动程序的 Nvidia 1070,在带有 OpenGL 4.6 的 Linux 上:

    #pragma optionNV(inline 0)

    在我的例子中,链接时间减少了近 20 倍,性能下降了大约 50%,这对于在开发中对着色器进行小幅调整非常有用。

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 2019-09-06
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2014-03-30
      • 1970-01-01
      相关资源
      最近更新 更多