发新话题
打印

[CELL编程] C语言关键字__restrict在Cell上的应用

C语言关键字__restrict在Cell上的应用

今天看到在一篇FFT在Cell上的优化文章中,提到关键字__restrict,说是它可以减少一些指令之间的dependency。以前还没有用过这个关键字,google了一下,有个理解比较好:
1. 首先我认为restrict只能修饰参数为指针类型的变量,否则没有意义。
2. 它只能用于修饰函数参数,否则也没有意义。
3. 编译器对它的实现是:(用上面那个函数举例,是个int *a加上int *b的函数)
把*a,*b都读入寄存器中(第一次访存),然后函数体内所有引用*a,*b的地方都使用寄存器里的值,所有对它们的修改也写入寄存器中,最后函数返回时,把寄存器中的值写回a,b指向的地址(第二次访存)。如果函数内部大量引用了a,b指向内存的值,这样的策略可以大大减小访存操作从而提高性能。当然,在x86机器上由于通用寄存器少,当寄存器溢出时,会为*a,*b都生成一个copy(这就是所谓的alias),这样反而会降低性能。但对于例如IA64这种有128个通用寄存器的机器来说,性能应该会大大提高。其实说了这么多,一句“进/出拷贝”就可以说明实质。
4.最后我认为restrict修饰集合类型的数据(例如struct)没有意义,因为对结构体的引用是多次访存,无法通过把值加载到寄存器中而避免多余的访存操作。

在Cell编程中,有些指针只是用来存储数据,某一个函数中总是访问某一个指针的不同区域,这样这个指针声明为__restrict是再好不过了,可以减少存取内存的操作,数据第一次载入寄存器后可以使用到函数退出才写入内存(如果寄存器足够容纳这些数据)。
我的签名!

TOP

good  呵呵
呼吸的是如此的自然,即使是狼也感觉不到

TOP

发新话题