读风辰大大的代码看到__restrict__,发现nvcc早就支持这个编译优化提示了,可是没看到哪本书讲过。
NV手册上说明与C99引入的restrict是相同特性,下面转自百度百科:
restrict是c99引入的,它只可以用于限定指针,并表明指针是访问一个数据对象的唯一且初始的方式.
考虑下面的例子: int ar[10]; int * restrict restar=(int *)malloc(10*sizeof(int)); int *par=ar; 这里说明restar是访问由malloc()分配的内存的唯一且初始的方式。par就不是了。 那么: for(n=0;n<10;n++) { par[n]+=5; restar[n]+=5; ar[n]*=2; par[n]+=3; restar[n]+=3; } 因为restar是访问分配的内存的唯一且初始的方式,那么编译器可以将上述对restar的操作进行优化: restar[n]+=8; 而par并不是访问数组ar的唯一方式,因此并不能进行下面的优化: par[n]+=8; 因为在par[n]+=3前,ar[n]*=2进行了改变。使用了关键字restric,编译器就可以放心地进行优化了。 这个关键字据说来源于古老的FORTRAN。
版权声明:本文为linxxx3原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。