altera-single-work-item-barrier¶
查找调用屏障函数但不调用 ID 函数 (get_local_id
, get_local_id
, get_group_id
或 get_local_linear_id
) 的 OpenCL 内核函数。
这些内核可能是可行的单工作项内核,但如果使用较新版本的 Altera 离线编译器(>= v17.01),则将被迫作为 NDRange 内核执行。
如果使用较旧版本的 Altera 离线编译器,这些内核函数将被视为单工作项内核,这可能会导致低效或如果意图使用 NDRange 语义则会导致错误。
基于 Altera SDK for OpenCL: 最佳实践指南。
示例
// error: function calls barrier but does not call an ID function.
void __kernel barrier_no_id(__global int * foo, int size) {
for (int i = 0; i < 100; i++) {
foo[i] += 5;
}
barrier(CLK_GLOBAL_MEM_FENCE);
}
// ok: function calls barrier and an ID function.
void __kernel barrier_with_id(__global int * foo, int size) {
for (int i = 0; i < 100; i++) {
int tid = get_global_id(0);
foo[tid] += 5;
}
barrier(CLK_GLOBAL_MEM_FENCE);
}
// ok with AOC Version 17.01: the reqd_work_group_size turns this into
// an NDRange.
__attribute__((reqd_work_group_size(2,2,2)))
void __kernel barrier_with_id(__global int * foo, int size) {
for (int i = 0; i < 100; i++) {
foo[tid] += 5;
}
barrier(CLK_GLOBAL_MEM_FENCE);
}
选项¶
- AOCVersion¶
定义 Altera 离线编译器的版本。默认值为
1600
(对应版本 16.00)。