码迷,mamicode.com
首页 > 其他好文 > 详细

#pragma UNROLL 4

时间:2015-04-13 19:03:37      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:dx11   opengl   cuda   图像处理   #pragma unroll 4   

在图像处理程序中,你会看到类似于#pragma unroll 4这样的语句(注:在DX中,也许你会见到[unroll(3)] for(int i = 0;i < Total; i++)类似情况),现具体解释如下:


语法:

#pragma UNROLL(n)

#pragma UNROLL告诉编译器一个循环中应该展开n次(其实我觉得是告诉编译器循环展开n次是安全的),有助于对那些不容易展开的循环有更大概率的进行软件流水。

其实很多很多时候编译器会自动判断各种信息,但是这增加了冗余开销,反倒不如直接把我们优化工程师知道的东西告诉编译器。

例:

int JackeryTest [160];

#pragma unroll(4)

for(int i=0;i<160;i )

{

JackeryTest [i]=i;

}

此处你应该知道在GPU处理过程中,对像素点的操作是并行操作的,所以在Shader中,可以看到这样的处理方式,来提高程序执行效!上面代码就告诉了编译器循环中展开4次并行执行的循环是安全的,如果编译器的软件流水可以顺利打开且不考虑软件流水填充和排空,那么上面代码就相当于如下代码并行执行,

for(int i=0;i<160;i +=4)

JackeryTest [i]=i; //并行

JackeryTest [i +1]=i +1; //并行

JackeryTest [i +2]=i +2; //并行

JackeryTest [i +3]=i +3; //并行

注意:

(1) 循环的次数是n的整数倍

(2) 其实一般都是和#pragma MUST_INTERATE配合使用,这样可以更全面的告诉编译器我们知道的信息,以使编译器有效开通软件流水。

(3) #pragma MUST_INTERAT(1)告知编译器不要进行循环展开。

(4) 不要使用多条#pragma MUST_INTERAT语句,这样做的话编译器不一定执行的是那条#pragma MUST_INTERAT

(5) 如果设置了-O1,-O2,-O3等编译选项则#pragma UNROLL(n)的设置是无效的


#pragma UNROLL 4

标签:dx11   opengl   cuda   图像处理   #pragma unroll 4   

原文地址:http://blog.csdn.net/gggg_ggg/article/details/45028419

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!