2

我有一个 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();
    }
}

或使用选项推送和弹出。我可以用 CUDA 做一些等效的事情吗?

4

1 回答 1

6

#pragma unroll是 CUDA C 编程指南 5.5 中记录的唯一请求展开的机制,并且必须在每个循环之前指定。但是默认情况下,编译器会展开所有“具有已知行程计数的小循环”,因此您可能不需要第一个示例中的展开指令。

我认为在功能级别控制展开并不是那么有用。您可能最初应该依靠编译器来选择最佳展开量,然后如果分析表明它可以提供帮助,则分别调整每个循环。

于 2013-12-18T16:05:17.540 回答