我正在玩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 *)
指令(例如,在最后一行中抛出一个指令,它会覆盖它上面的所有指令)。
答案 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%左右,对于在开发中对着色器进行细微调整非常有用。