OpenCL优化方法-消除访问内存数组引起的循环依赖关系
来源:互联网 发布:战国史se人物数据 编辑:程序博客网 时间:2024/06/08 10:25
消除访问内存数组引起的循环依赖关系
在单个工作项内核中包含ivdep pragma,可以声明对内存数组的访问不会导致循环依赖。在编译期间,OpenCL离线编译器的英特尔FPGA SDK创建了可确保加载和存储指令在依赖关系约束下运行的硬件。依赖约束的一个例子是依赖的加载和存储指令必须按顺序执行。ivdep pragma的存在指示离线编译器移除循环中加载和存储指令之间的额外硬件,此循环在内核代码中紧跟在pragma声明之后。额外硬件的删除可能会降低逻辑利用率,并降低单个工作项内核中的II值。
如果想要对循环内存数组的所有访问都不会导致循环依赖,可在内核代码中的循环之前添加#pragma ivdep行。
内核代码示例:
// no loop-carried dependencies for A and B array accesses
#pragma ivdep
for(int i = 0; i < N; i++) {
A[i] = A[i - X[i]];
B[i] = B[i - Y[i]];
要指定对循环内的特定内存数组的访问不会导致循环依赖,请在内核代码中的循环之前添加行#pragma ivdep数组(array_name)。
由ivdep pragma指定的数组必须是本地或专用的存储器数组,或指向全局,本地或专用存储器的指针变量。如果指定的数组是一个指针,则ivdep pragma也适用于可能与指定指针进行别名的所有数组。
由ivdep pragma指定的数组也可以是一个数组或一个struct的指针成员。
内核代码示例:
// No loop-carried dependencies for A array accesses
// The offline compiler will insert hardware that reinforces dependency
constraints for B
#pragma ivdep array(A)
for(int i = 0; i < N; i++) {
A[i] = A[i - X[i]];
B[i] = B[i - Y[i]];
}
// No loop-carried dependencies for array A inside struct
#pragma ivdep array(S.A)
for(int i = 0; i < N; i++) {
S.A[i] = S.A[i - X[i]];
}
// No loop-carried dependencies for array A inside the struct pointed by S
#pragma ivdep array(S->X[2][3].A)
for(int i = 0; i < N; i++) {
S->X[2][3].A[i] = S.A[i - X[i]];
}
// No loop-carried dependencies for A and B because ptr aliases
// with both arrays
int *ptr = select ? A : B;
#pragma ivdep array(ptr)
for(int i = 0; i < N; i++) {
A[i] = A[i - X[i]];
B[i] = B[i - Y[i]];
}
// No loop-carried dependencies for A because ptr only aliases with A
int *ptr = &A[10];
#pragma ivdep array(ptr)
for(int i = 0; i < N; i++) {
A[i] = A[i - X[i]];
B[i] = B[i - Y[i]];
}
阅读全文
0 0
- OpenCL优化方法-消除访问内存数组引起的循环依赖关系
- 消除循环依赖
- C#泛型: 消除Visitor模式的循环依赖, 以及无聊的Accept方法
- 友元类成员的依赖关系|循环依赖
- 数组边界引起的死循环
- 优化JS引起UIWebview的内存泄露
- 优化变成了忧患:String类的split方法引起的内存泄漏
- 优化变成了忧患:String类的split方法引起的内存泄漏(转)
- Hibernate 关联关系中toString引起的死循环
- 消除VISITOR模式中的循环依赖
- CTS 认证 低内存优化引起fail项验证方法
- android内存优化-Activity, Thread引起的内存泄露0
- C语言优化实例:消除多级指针的间接访问
- OpenCL 与CUDA的关系
- 优化的内存访问 TCMalloc
- 优化的内存访问 TCMalloc
- 重构 — 改善既有的类图设计 条款4:消除重复的依赖关系
- PHPUnit测试方法间的依赖关系
- 浅谈spring中@Conditional(条件注解)
- 巧用BeanUtils
- 训练日记-1
- Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全
- 漫步最优化二十一——全局收敛
- OpenCL优化方法-消除访问内存数组引起的循环依赖关系
- java中的基本用法
- CSU-ACM2017暑期训练6-bfs I
- 贪吃蛇案例
- 抓包工具
- 数据结构实验之图论七:驴友计划(Floyd)
- 解决ios微信不能自动播放音乐
- 并发(十三):线程都可以中断吗?
- Angular 依赖注入