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

最佳答案

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


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

如果#pragma展开后未指定任何数字,则循环的行程计数为常数将完全展开,否则根本不会展开。


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

#pragma optionNV(unroll)


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

09-08 10:31