繁体   English   中英

c# 10000 x 10000 矩阵乘法

[英]c# 10000 x 10000 matrix multiplication

我需要对两个维度为 10,000 x 10,000 的矩阵执行矩阵乘法。 我用的是简单的数组乘法,用了2个多小时才算完。 我需要减少完成乘法的次数。

 Double[,] array1 = new double [10000, 10000];
 Double[,] array2 = new double [10000, 10000];
 Random randNum = new Random();

 for (int i = 0; i < array1.GetLength(0); i++)
 {
     for (int j = 0; j < array1.GetLength(1); j++)
     {
         array1[i, j] = randNum.Next(1, 10);
     }
 }

 for (int i = 0; i < array2.GetLength(0); i++)
 {
     for (int j = 0; j < array2.GetLength(1); j++)
     {
         array2[i, j] = randNum.Next(1, 10);
     }
 }

Double [,] mt = mMat(array1,array2);

public static double[,] mMat(double[,] A, double[,] B)
{

    int aRows = A.GetLength(0);
    int aColumns = A.GetLength(1);
    int bRows = B.GetLength(0);
    int bColumns = B.GetLength(1);

    if (aColumns != bRows)
    {

        throw new ArgumentException("A:Rows: " + aColumns + " did not match B:Columns " + bRows + ".");
    }

    double[,] C = new double[aRows, bColumns];

    for (int i = 0; i < aRows; i++)
    { // aRow
        for (int j = 0; j < bColumns; j++)
        { // bColumn
            for (int k = 0; k < aColumns; k++)
            { // aColumn
                C[i, j] += A[i, k] * B[k, j];
            }
        }
    }

    return C;
}

我是编程界的新手,需要完成执行大型矩阵乘法的任务

我最近为 C# 基准测试做了同样的事情,这里有一些技巧可以让它运行得更快。 C# 版本在 8 核笔记本电脑上运行时间约为 1 分 15 秒。

  1. 在开始矩阵乘法之前计算 B 的转置,因为按行顺序访问矩阵比按列顺序访问矩阵快得多。 Scott Meyers做了一个关于 CPU 缓存的演讲,解释了为什么行顺序遍历更快。

  2. 使外部循环成为Parallel.For循环。 该链接还有一些使用矩阵乘法的示例。

  3. 使用Vector类来利用 SIMD。

  4. 除非你真的需要额外的精度,否则请考虑使用 float 而不是 double。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM