c++ - 我可以告诉 nvcc 将 #pragma unroll 应用于函数中的所有循环吗?

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

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

或者使用选项 pushing-and-popping。我可以用 CUDA 做一些等效的事情吗?

最佳答案

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

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

关于c++ - 我可以告诉 nvcc 将 #pragma unroll 应用于函数中的所有循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20655257/

相关文章:

c - 如何将元素 (cv::Point) 添加到共享数组中 - CUDA

c++ - 使用 CTreeCtrl 检索 LPARAM 中的项目

c++ - 使用自定义 Clang + Libc++(而不是 stdlibc++)编译 Tensorflow

c++ - 在同一个程序中混合 cout 和 wcout

c# - 有什么方法可以优化这个 LINQ to Entities 查询吗?

c - 有没有办法优化C中的矩阵乘法?

c++ - const 条件的分支预测

c++ - 在 Windows 8 中禁用 CUDA 的 TDR

windows - 在 Windows 中将 .cu 文件转换为 .ptx 文件

c++ - 使用 DX 缩放对象