【发布时间】:2011-08-28 23:50:31
【问题描述】:
我正在做一些矩阵乘法基准测试,如前所述 Why is MATLAB so fast in matrix multiplication?
现在我遇到了另一个问题,当将两个 2048x2048 矩阵相乘时,C# 与其他矩阵之间存在很大差异。当我尝试仅乘以 2047x2047 矩阵时,这似乎很正常。还添加了一些其他的进行比较。
1024x1024 - 10 秒。
1027x1027 - 10 秒。
2047x2047 - 90 秒。
2048x2048 - 300 秒。
2049x2049 - 91 秒。 (更新)
2500x2500 - 166 秒
对于 2k x 2k 的情况,这相差三分半钟。
使用 2dim 数组
//Array init like this
int rozmer = 2048;
float[,] matice = new float[rozmer, rozmer];
//Main multiply code
for(int j = 0; j < rozmer; j++)
{
for (int k = 0; k < rozmer; k++)
{
float temp = 0;
for (int m = 0; m < rozmer; m++)
{
temp = temp + matice1[j,m] * matice2[m,k];
}
matice3[j, k] = temp;
}
}
【问题讨论】:
-
对于高级 C 编程或 OS 设计课程来说,这将是一道很棒的考试题 ;-)
-
您是否尝试过测试多维 [,] 和锯齿状 [][] 数组以及 32 位和 64 位数组?我只测试了几次,但锯齿状看起来更符合你的结果,但锯齿状的 64 位很高,我不知道 jit 中是否有任何适用于这种情况的启发式方法,或者它的缓存是否与之前建议的那样相关。如果你想要一个 GPGPU 解决方案,research.microsoft.com/en-us/projects/accelerator 应该可以与你其他帖子中的时代竞争。
-
有点幼稚的问题,但是将两个方阵相乘涉及多少操作(加法/乘法)?
标签: c# arrays matrix-multiplication