__restrict__ 关键字

adagio_chen 2014-09-23 10:04:12
加精
C99标准中引入了restricted指针,用以缓解C语言中指针二义性的问题。缓解指针二义性问题可用于编译器的代码优化。下面是一个指针二义性的例子:


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语言中,指针a, b, 和c可能有二义性,因而对数组c的写入可能会更改数组a和b的元素的值。这就意味着,为了保证程序的正确性,编译器不能把a[0]和b[0]装载入寄存器,对它们做乘法,然后把结果写入c[0]和c[1],这是因为有这种可能——a[0]和c[0]是同一个地址。故而编译器无法对相同的表达式进行优化。

通过把a, b, c声明为restricted指针,程序员可以断言这些指针实际上没有二义性(这里,所有的指针参数都要被设为__restrict__)

void foo(const float* __restrict__a,
const float* __restrict__ b,
float* __restrict__ c)


在增加了__restrict__关键字以后,编译器可以根据需要对代码进行优化:

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


这样便可以减访存次数和计算量,而代价是增加寄存器的使用量。考虑到额外的寄存器使用可能会降低occupancy,以此并不排斥此种优化会带来负面效果。
...全文
6251 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Link_World 2014-09-29
  • 打赏
  • 举报
回复
是c语言,有点伤心,你百度一下吧
AmelieLiu 2014-09-24
  • 打赏
  • 举报
回复
支持版主,多多发这样的帖子
YCMyTot 2014-09-24
  • 打赏
  • 举报
回复
多谢斑竹分享!
vincent_ws 2014-09-23
  • 打赏
  • 举报
回复
vincent_ws 2014-09-23
  • 打赏
  • 举报
回复
vincent_ws 2014-09-23
  • 打赏
  • 举报
回复
<url="www.baidu.com">百度</url>
GW786228836 2014-09-23
  • 打赏
  • 举报
回复

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧