gpt4 book ai didi

cuda - const * __restrict__ 可以增加 cuda 寄存器的使用吗?

转载 作者:行者123 更新时间:2023-12-05 00:51:41 25 4
gpt4 key购买 nike

因为我的指针都指向非重叠内存,所以我全力以赴将传递给内核(及其内联函数)的指针替换为限制,并使它们也成为常量,只要有可能。然而,这增加了一些内核的寄存器使用,而减少了其他内核的使用。这对我来说没有多大意义。

有人知道为什么会这样吗?

最佳答案

是的,它可以增加寄存器的使用。

引用programming guide对于 __restrict__:

The effects here are a reduced number of memory accesses and reduced number of computations. This is balanced by an increase in register pressure due to "cached" loads and common sub-expressions.

Since register pressure is a critical issue in many CUDA codes, use of restricted pointers can have negative performance impact on CUDA code, due to reduced occupancy.

const __restrict__ 至少有两个原因可能是有益的:

  1. 在支持它的架构上,它可以让编译器发现 constant cache 的用途这可能是一项性能增强功能。

  2. 如上面链接的编程指南部分所述,它可以使编译器进行其他优化(例如减少指令和内存访问),如果相应的寄存器压力不存在,这也可以提高性能成为一个问题

减少导致寄存器压力增加的指令和内存访问可能是不直观的。让我们考虑上面编程指南链接中给出的示例:

void foo(const float* a, const float* b, float* c) { 
c[0] = a[0] * b[0];
c[1] = a[0] * b[0];
c[2] = a[0] * b[0] * a[1];
c[3] = a[0] * a[1];
c[4] = a[0] * b[0];
c[5] = b[0]; ... }

如果我们在上面的例子中允许指针别名,那么编译器就不能做很多优化,并且编译器基本上只能按照编写的代码执行。第一行代码:

  c[0] = a[0] * b[0]; 

将需要 3 个寄存器。下一行代码:

  c[1] = a[0] * b[0]; 

还需要 3 个寄存器,因为所有内容都是按写入生成的,所以它们可以是 相同的 3 个寄存器,可以重复使用。示例的其余部分可能会发生类似的寄存器重用,从而降低总体寄存器使用率/压力。

但是,如果我们允许编译器重新排序,那么我们必须为预先加载的每个值分配寄存器,并保留到该值退出为止。这种重新排序可以增加寄存器使用/压力,但最终可能导致更快的代码(或者它可能导致更慢的代码,如果寄存器压力成为性能限制器。)

关于cuda - const * __restrict__ 可以增加 cuda 寄存器的使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31344454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com