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

 辉 发布于 2023-02-09 14:56

我有一个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做些什么吗?

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

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

    2023-02-09 14:59 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有