#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)的设置是无效的

时间: 2024-10-06 02:47:34

#pragma UNROLL 4的相关文章

CUDA ---- Constant Memory

CONSTANT  MEMORY constant Memory对于device来说只读但是对于host是可读可写.constant Memory和global Memory一样都位于DRAM,并且有一个独立的on-chip cache,比直接从constant Memory读取要快得多.每个SM上constant Memory大小限制为64KB. constant Memory的获取方式不同于其它的GPU内存,对于constant Memory来说,最佳获取方式是warp中的32个thread

基于NVIDIA GPU的MD5加速穷举(CUDA)

声明:本文仅限于技术分享,请勿将代码用于非法用途,利用本文代码所产生的各种法律问题,与本文作者无关. 1. 摘要: MD5为非常普遍使用的消息摘要算法,很多应用系统采用该算法加密密码,在计算文件摘要值以验证文件是否被篡改方面也普遍使用, MD5服务安全方面很多年,随着计算机技术的发展,该算法已经很不安全,穷举遍历的代价也变得没那么高,笔者建议至少采用(SHA1+盐值) 方法加密新建设的应用系统,由于目前很多网站大量的用户名密码泄露,个人的信息安全也越来越重要,目前很多系统采用的加密算法有: 1>

CUFFT 高速运行之谜

最近在做并行计算, 应用的是典型的计算快速傅立叶变换 FFT, 程序设计的环境是 Window7, GTX 660ti  使用的软件操作是  CUDA 6.0, OpenCL1.2 , VC2005 笔者试图破解 CUFFT 高速运行之谜, 但很遗憾未能如愿, 其探索过程却有颇多趣味, 写出来与诸位亲们共勉. 实验设计是这样的, 笔者要做规模为 2048 的 FFT 做512 次, 这样得到的结果用 matlab 来衡量程序计算结果的正确性. 在保证正确性的条件下, 测量程序中 512次规模为2

sha256_transform

DECLSPEC void sha256_transform (const u32 *w0, const u32 *w1, const u32 *w2, const u32 *w3, u32 *digest) { u32 a = digest[0]; u32 b = digest[1]; u32 c = digest[2]; u32 d = digest[3]; u32 e = digest[4]; u32 f = digest[5]; u32 g = digest[6]; u32 h = di

swift pragma mark

众所周知,大家在OC中对代码进行逻辑组织 用的是#pragma mark - ,生成分隔线 用#pragma mark 函数说明,来生成一个函数的说明X 但在swift中,这个语法就不支持了,毕竟它是属于C的语法,于是就有了新的一些语法,如:// MARK: // FIXME // TODO: 等 // MARK: - 生成分隔线 // MARK: 说明 别忘了那个冒号... 参考 :http://stackoverflow.com/questions/24017316/pragma-mark-

C++ #pragma 预处理指令

#pragma 预编译指令的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征. 其使用的格式一般为: #pragma Para.其中Para 为参数,常见的参数如下: (1)Message参数 Message参数编译信息输出窗口中输出相应地信息,使用方法如下: #pragma message("消息文本") 使用示例,假如在程序中我们定义了很多宏来控制源代码版本的

[C++]关于头文件中的防卫式声明(#ifndef...#pragma once)

大家知道,我们写.h文件时,通常会加上防卫式声明,有以下两种方式: 1. 宏定义 #ifndef _FILENAME_ #define _FILENAME_ //... #endif 2. 编译器指令 #pragma once 但是,为什么头文件中需要添加这种防卫式声明呢?如果没有这样的声明,会出现怎样的问题.这里,先看一个例子. -- "Car.h",代码如下(并没有添加防卫式声明): // Car.h class Car { // ... }; -- "Person.h&

#pragma预处理命令

#pragma预处理命令 #pragma可以说是C++中最复杂的预处理指令了,下面是最常用的几个#pragma指令: #pragma comment(lib,"XXX.lib") 表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样. #pragma comment(linker,"/ENTRY:main_function") 表示指定链接器选项/ENTRY:main_function #pragma once 表示这个文件只被包含一次 #pra

关于C++代码中的#pragma预处理指令

预处理指令是指在编译器编译代码时,提供按条件跳过源文件中的代码段(节).报告错误(错误信息以及行号)和警告条件,以及描绘源代码的不同区域的能力. 总是占用源代码中的单独一行,并且总是以 # 字符和预处理指令名称开头.# 字符的前面以及 # 字符与指令名称之间可以出现空白符. 下面是可用的预处理指令: #define 和 #undef,分别用于定义和取消定义条件编译符号. #if.#elif.#else 和 #endif,用于按条件跳过源代码中的节. #line,用于控制行号(在发布错误和警告信息