gpt4 book ai didi

c - C 函数调用造成巨大开销

转载 作者:行者123 更新时间:2023-11-30 20:25:37 25 4
gpt4 key购买 nike

我有一个简单的函数,可以将两个矩阵相乘。

void mmul1(float A[ni][nk], float B[nk][nj], float C[ni][nj])
{
int i, j, k;
for (i=0; i<ni; i++) {
for (j=0; j<nj; j++) {
C[i][j] = 0;
for (k=0; k<nk; k++) {
C[i][j] += A[i][k]*B[k][j];
}
}
}
}

我有一个如下所示的主要功能:

int main(int argc, char** argv) {

// timer structs
struct timeval ts, te, td;
float tser, tpar, diff;
int i, j, k;

printf("matrix size : %d x %d x %d\n", ni, nj, nk);

srand(0);

// initialization
for (i=0; i<ni; i++) {
for (k=0; k<nk; k++) {
A[i][k] = (float)rand()/RAND_MAX;
}
}
for (k=0; k<nk; k++) {
for (j=0; j<nj; j++) {
B[k][j] = (float)rand()/RAND_MAX;
}
}

gettimeofday(&ts, NULL);
for (i=0; i<ni; i++) {
for (j=0; j<nj; j++) {
Cans[i][j] = 0;
for (k=0; k<nk; k++) {
Cans[i][j] += A[i][k]*B[k][j];
}
}
}
gettimeofday(&te, NULL);
timersub(&ts, &te, &td);
tser = fabs(td.tv_sec+(float)td.tv_usec/1000000.0);

gettimeofday(&ts, NULL);
mmul1(A, B, C);
gettimeofday(&te, NULL);
timersub(&ts, &te, &td);
tpar = fabs(td.tv_sec+(float)td.tv_usec/1000000.0);

// compare results
diff = compute_diff(C, Cans);

printf("Performance : %.2f GFlop/s (%.1fX)\n", 2.0*ni*nj*nk/tpar/1000000000, tser/tpar );
printf("Result Diff : %.3f\n", diff );

return 0;
}

我正在使用 gcc 的 -O3 进行编译标志。

测试时发现如果添加 static inlinemult的签名,在 512x512 矩阵上测试时,我获得了 5 倍的加速。与乘法相比,函数调用的开销应该可以忽略不计。为什么会出现这种性能损失(编译器是否生成不同的机器代码?),以及如何在没有 inline 的情况下修复它? ing mult

最佳答案

由于您没有使用 main 中的结果,因此当您内联该函数时,优化器可以看到没有使用任何副作用,并且可以随意删除所有矩阵乘法代码。

您可以使用gcc-S标志来查看生成的汇编代码。

关于c - C 函数调用造成巨大开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28020079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com