问题描述
我正在使用nvidia的unroll loops指令,但是还没有找到一种有选择地打开它的方法.
I'm playing around with nvidia's unroll loops directive, but haven't seen a way to turn it on selectively.
让我说我有这个...
Lets say I have this...
void testUnroll()
{
#pragma optionNV(unroll all)
for (...)
...
}
void testNoUnroll()
{
for (...)
...
}
在这里,我假设两个循环最终都被展开.为了阻止这种情况,我认为解决方案将涉及在我想要影响的块之后重置指令,例如:
Here, I'm assuming both loops end up being unrolled. To stop this I think the solution will involve resetting the directive after the block I want affected, for example:
#pragma optionNV(unroll all)
for (...)
...
#pragma optionNV(unroll default) //??
但是我不知道将展开行为重置为初始/默认设置的关键字. 这怎么办?如果有人还能指出一些有关NVIDIA编译器指令的官方文档,那就更好了.
However I don't know the keyword to reset the unroll behaviour to the initial/default setting. How can this be done? If anyone could also point to some official docs for nvidia's compiler directives that'd be even better.
当前,似乎只使用了程序中找到的最后一个#pragma optionNV(unroll *)
指令(例如,在最后一行中抛出一个指令,它将覆盖上面的所有内容).
Currently, it seems only the last #pragma optionNV(unroll *)
directive found in the program is used (eg throw one in the last line and it overrides everything above it).
推荐答案
根据此帖子在NVidia论坛上,之后没有关键字会将其设置为默认行为:
According to this post on the NVidia forums, having no keyword afterwards will set it to default behavior:
如果#pragma展开后未指定任何编号,则循环的跳变计数为常数时将完全展开,否则根本不会展开.
If no number is specified after #pragma unroll, the loop is completely unrolled if its trip count is constant, otherwise it is not unrolled at all.
我不确定它是否可以在GLSL上运行,但是您可以尝试:
I'm not sure if it works on GLSL, but you can maybe try:
#pragma optionNV(unroll)
如果有人尝试过,请告诉我们是否可行!
If anyone tries this, let us know if it works!
这篇关于选择性nvidia #pragma optionNV(全部展开)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!