gpt4 book ai didi

c - 循环展开以将两个矩阵 NxN 相乘?

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

我正在尝试找出一个好的循环展开来将两个矩阵相乘。

例如,如果我们想要对 NxN 矩阵求和:

void SumMatrix(int *M, int n, int *result) 
{
int i,j;

*result = 0;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
*result += M[j][i];
}

我们可以做到这一点:

void SumMatrix(int *M, int n, int *result) 
{
int i;
int size = n*n;
int last = size%8;
int acc1 = 0;
int acc2 = 0;
int *pEnd = M+size-last;

for (; M<pEnd; M+=8)
{
acc1 += (*M + *(M+1)) + (*(M+2) + *(M+3));
acc2 += (*(M+4) + *(M+5)) + (*(M+6) + *(M+7));
}

/* adding the last entries */
while (last--)
acc1 += *(M++);

*result = acc1+acc2;
}

但是我试图找到一种(好)方法来乘以 2 个矩阵,但目前没有找到。

备注:这不是家庭作业,我今天有考试,只是想到了这个问题,我认为这可能是一个很好的考试问题,不是吗?

如果有任何帮助,我将不胜感激

问候

罗恩

最佳答案

大多数编译器都会为您执行展开操作(您可能需要打开一个标志,或将其设置为优化级别 - 我相信 -funroll-loops 会为 gcc 执行此操作)。

另外,对于你的问题,它是一个二维矩阵这一事实并不重要,因为你正在将所有数字相加。如果您仅限于单个进程/线程,则按顺序将数字相加将是最快的,因为这样具有最佳的缓存性能。您可能会从 SSE 或 vector 指令中获得一些好处;同样,今天的编译器可以为您解决如此简单的问题。

关于c - 循环展开以将两个矩阵 NxN 相乘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10222867/

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