【发布时间】:2019-01-06 09:04:01
【问题描述】:
有什么办法可以加速这个功能:
void task(int I, int J, int K, int *L, int **ids, double *bar){
double *foo[K];
for (int k=0;k<K;k++)
foo[k] = new double[I*L[k]];
// I am filling these arrays somehow
// This is not a bottleneck, hence omitted here
for (int i=0;i<I;i++)
for (int j=0;j<J;j++){
double tmp = 1.;
for (int k=0;k<K;k++)
tmp *= foo[k][i*L[k]+ids[j][k]]; //ids[j][k]<L[k]
bar[i*J+j] = tmp;
}
}
典型值为:I = 100,000、J = 10,000、K=3、L=[50,20,60]。
我读到__restrict__ 关键字/扩展名可能会有所帮助,但我不确定如何在此处应用它。例如,尝试将其放入foo[k] = new double[...] 的定义中,我得到error: '__restrict_ qualifiers cannot be applied to double。此外,我不知道我是否应该/如何将ids 和ids[j], 1<= j<= J 声明为受限。
请注意,在我的实际代码中,我会在与我的 CPU 内核一样多的线程中并行执行此类任务。
我主要编写与 C 兼容的 C++,因此欢迎使用两种语言的解决方案。
【问题讨论】:
-
restrict不是 C++ 的一部分,也没有明确定义。有关详细信息,请参阅stackoverflow.com/questions/776283/…。填写std::vector并按值返回怎么样,甚至不需要限制 -
这里不需要
restrict,你不要修改可能的别名。 -
您是否有使用这种不规则/嵌套的数组格式,而不是平面的一维数组?除了
__restrict之外,可能还有加速,但我不确定我是否理解这段代码在做什么。可能只是手动将ids[j]之类的东西从循环中提升出来会有所帮助,而循环foo[k][ stuff(k) ]对于内部循环来说看起来很讨厌。你不能在你的初始循环中构建一个更有用的数据结构,在三重嵌套循环之外,给你更好的内存访问模式吗? -
double *foo[K];不是有效的 C++,因为它使用 VLA 扩展。 -
@Bananach 如果您有工作代码并要求改进,您最好将这个问题发布到SE Code Review。确保您的问题符合那里的政策设置。
标签: c++ c optimization compiler-optimization micro-optimization