我有一个CUDA内核,带有一堆我想要展开的循环。现在我做:
void mykernel(int* in, int* out, int baz) {
#pragma unroll
for(int i = 0; i < 4; i++) {
foo();
}
/* ... */
#pragma unroll
for(int i = 0; i < 6; i++) {
bar();
}
}
等等。我想告诉(提示)我的C / C ++编译器展开所有这些循环,而不需要为每个循环单独提示。但是,我不希望在该函数中展开文件中所有代码中的所有循环。
如果这是GCC,我可以这样做:
__attribute__((optimize("unroll-loops")))
void mykernel(int* in, int* out, int baz) {
for(int i = 0; i < 4; i++) {
foo();
}
/* ... */
for(int i = 0; i < 6; i++) {
bar();
}
}
或者使用选项push-and-popping。我能用CUDA做些什么吗?
答案 0 :(得分:6)
#pragma unroll
是CUDA C编程指南5.5中记录的唯一请求展开的机制,必须在每个循环之前指定。但是默认情况下,编译器会展开所有“具有已知行程计数的小循环”,因此您可能不需要在第一个示例中使用unroll指令。
我不认为在功能级别控制展开会非常有用。您应该最初依靠编译器来选择最佳的展开量,然后如果分析表明它可以提供帮助,则分别调整每个循环。