【问题标题】:Can I tell nvcc to apply #pragma unroll to all loops in a function?我可以告诉 nvcc 将#pragma unroll 应用于函数中的所有循环吗?
【发布时间】:2013-12-18 10:14:27
【问题描述】:

我有一个 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 做一些等效的事情吗?

【问题讨论】:

    标签: c++ optimization cuda compiler-directives loop-unrolling


    【解决方案1】:

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

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

    【讨论】:

    • 什么是“小循环”?
    • 我认为 NVIDIA 不会发布自动展开的启发式方法,但除了行程计数之外,还可能会考虑循环中的指令数量和目标计算能力等因素。 @njuffa 提供了一些有用的信息here
    猜你喜欢
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2014-08-22
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多