选择性的nvidia #pragma optionNV(全部展开)

时间:2013-12-06 04:10:36

标签: opengl glsl nvidia

我正在玩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 *)指令(例如,在最后一行中抛出一个指令,它会覆盖它上面的所有指令)。

2 个答案:

答案 0 :(得分:0)

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

  

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

     

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

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

#pragma optionNV(unroll)

如果有人试图这样做,请告诉我们是否有效!

答案 1 :(得分:0)

我不记得是在哪里找到的,但是我可以确认它在具有OpenGL 4.6的Linux上具有435驱动程序的Nvidia 1070上可以工作:

public static void isPrime(int num) { int k = (num - 2) / 2; int[] a = new int[k + 1]; for (int i = 1; i < k + 1; i++) { int j = i; while ((i + j + 2 * i * j) <= k) { a[i + j + 2 * i * j] = 1; j += 1; } } if (num > 2) { System.out.println(2); } for (int l = 1; l < k + 1; l++) { if (a[l] == 0) { System.out.println((2 * l + 1)); } } }

在我的情况下,链接时间减少了近20倍,性能下降了50%左右,对于在开发中对着色器进行细微调整非常有用。