gpt4 book ai didi

C - 矩阵乘法在单独的函数中很慢,但在主函数中非常快

转载 作者:太空宇宙 更新时间:2023-11-04 03:53:14 26 4
gpt4 key购买 nike

我正在用 C 优化矩阵乘法程序。目前我的代码是这样的:

首先我有一个矩阵结构:

typedef struct
{
float ** element;
} matrix;

然后我编写了一个矩阵乘法例程,并通过转置第二个矩阵并使用 simd 对其进行了优化:

void mulMatrices(matrix a, matrix b, matrix result)
{

int i, j, k;
long long before, after;

before = wall_clock_time();

transpose_matrix(&b);

for (i = 0; i < size; i++)
for (j = 0; j < size; j++)
{
__m128 vresult = _mm_setzero_ps();
for(k = 0; k < size; k += 4)
{
vresult = _mm_add_ps(vresult, _mm_mul_ps(_mm_load_ps(&(a.element[i][k])), _mm_load_ps(&(b.element[j][k]))));
}
result.element[i][j] = vresult[0] + vresult[1] + vresult[2] + vresult[3];
}

after = wall_clock_time();
}

最后我写了一个辅助函数来初始化矩阵并调用乘法函数

void work()
{
matrix a, b, result;

// Initialise matrices

// Perform sequential matrix multiplication
mulMatrices(a, b, result);

// Print the result matrix
//print_matrix(result);

}

我的主要功能如下:

int main(int argc, char ** argv)
{
// Multiply the matrices
work();
return 0;
}

我已经可以用这些东西取得相当令人满意的结果。但是我发现,如果我精简每一件事并将所有代码移到 main 函数中,它会快 100 倍以上。矩阵的大小至少为 1024 * 1024。我想这与调用堆栈有关,但我不明白。有人可以解释一下。谢谢

最佳答案

您可能会遇到 aliasing问题。基本上当通过指针编辑值时,编译器不知道您是否修改了它已经读取的内容,因此每次都必须从内存中重新读取值。

这是描述问题的白皮书:ftp://ftp.sgi.com/sgi/audio/audio.apps/dev/aliasing.html

通过将所有代码直接移动到您的 main 中,您已经删除了别名,从而显着提高了性能。

关于C - 矩阵乘法在单独的函数中很慢,但在主函数中非常快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19187775/

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