簡體   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