Pio*_*icz 11 c optimization c99 restrict restrict-qualifier
有没有办法告诉C99编译器我要访问给定数组的唯一方法是使用myarray [index]?说这样的话:
int heavy_calcualtions(float* restrict range1, float* restrict range2)
{
float __I promise I won't alias this__ tmpvalues[1000] = {0};
....
heavy calculations using range1, range2 and tmpvalues;
....
}
Run Code Online (Sandbox Code Playgroud)
通过使用restrict我承诺我不会为range1和range2设置别名但是我如何为我的函数内部声明的数组做同样的事情?
Har*_*ald 11
尽管杰夫的答案是正确的,也就是说,你总是可以做出一个指向分配的数组,但事实是,编译器知道在编译时间tmpvalues不会被混淆,因为变量声明为一个实际的阵列,而不是一个指针.别名数组的唯一机会是声明指向它的指针,所以如果你不这样做,就没有必要将它声明为restrict
.如果这是tmpvalues
函数中唯一的变量,则更明显.
如果将指针传递给另一个函数可能会出现问题,那么您应该说明接收的指针是否受限制.
我遇到的与此主题相关的文档包括C99:
设D是普通标识符的声明,它提供了一种将对象P指定为类型T的限制限定指针的方法.
请注意,它仅适用于指针.
TI的其他文档使用restrict
关键字提供了一些性能调优提示.除了所有提示之外,第3.3节提供了可以应用此类型限定符的示例,而不是.x
在第16页的中间查找数组声明,它声明它没有声明指针,因此不能被restrict
限定.
为什么你不能执行以下操作?您没有tmpvalues
通过该变量访问关联的数据,因此在代码的计算密集型部分使用限制指针是有效的。
#include <stdio.h>
#include <stdlib.h>
int heavy_calcs(int n, float* restrict range1, float* restrict range2)
{
if (n>1000) return 1;
float tmpvalues[1000] = {0};
{
float * restrict ptv = tmpvalues;
for (int i=0; i<n; i++) {
ptv[i] = range1[i] + range2[i];
}
}
return 0;
}
int main(int argc, char * argv[])
{
int n = (argc>1) ? atoi(argv[1]) : 1000;
float * r1 = (float*)malloc(n*sizeof(float));
float * r2 = (float*)malloc(n*sizeof(float));
int rc = heavy_calcs(n,r1,r2);
free(r1);
free(r2);
return rc;
}
Run Code Online (Sandbox Code Playgroud)
我通过 Intel 15 编译器运行了这个,它对循环进行矢量化没有遇到任何问题。当然,与我假设的你的循环相比,这个循环是微不足道的,所以你的里程可能会有所不同。