W elcome to
Fintronic USA

redball.gif (326 bytes)About Fintronic USA

redball.gif (326 bytes)Main announcements

redball.gif (326 bytes)What's new at Fintronic

redball.gif (326 bytes)What our customers are saying...

redball.gif (326 bytes)Support for SystemC

redball.gif (326 bytes)Support for Verilog 2001

redball.gif (326 bytes)Third party tools integrated with FinSim(Specman, Denali, Debussy, Undertow, Vera, VirSim, HDL Score, Comet, Meteor, NelSim, Pivot, DeskPOD, @Designer 2.1)

home.htmlProductsSupportEvaluateContact

Inverting a 400000x400000 sparse matrix in Verilog


This example works on FinSim 10_04_22 and subsequent versions.

This example inverts a simple sparse matrice of 4 million x 4 million elements of type real, uses two norm system functions to measure it and displays all non-zero values on one line and one column.

On a single 32 bit Pentium 1.8GHz processor this example run in 225 seconds.

module top;
  parameter integer size = 4000000;
  real      MReal1 [size-1 : 0][size-1 : 0];
  real      MRInv [size-1 : 0][size-1 : 0];
  integer   found, lin, col, idx;
  integer   i;
  real      r, max, sum;

  initial begin
    /* declaring sparse matrices */
    $ToSparse(MReal1);
    $ToSparse(MRInv);
      
    /* initializing matrice to be inverted*/
    for (i = 0; i < size/2; i++)
      begin
        MReal1[2*i][i] = 7.0;
      end
    for (i = 0; i < size; i++)
      begin
	MReal1[i][i] = 1.0;
      end
                              
      /*inverting matrix */
      MRInv = MReal1 **(-1); 

      lin = 4*size/10;
      $display("displaying all non-zero values on line %d\n", lin);
      idx = -1;
      found = $SpReadNextNzElemInLine(MRInv, lin, col, idx, r);
      while (found) begin
	 $display("MRInv[%d][%d]=%e\n", lin, col, r);
	 found = $SpReadNextNzElemInLine(MRInv, lin, col, idx, r);
      end

      col = 2*size/10;
      $display("displaying all non-zero values on column %d\n", col);
      lin = -1;
      found = $SpReadNextNzElemInCol(MRInv, lin, col, r);
      while (found) begin
	 $display("MRInv[%d][%d]=%e\n", lin, col, r);
	 found = $SpReadNextNzElemInCol(MRInv, lin, col, r);
      end

      $display("********displaying norms and distances*********\n");
      max = $VpNormAbsMax(MRInv);
      sum = $VpNormAbsSum(MRInv);
      $display("max=%e, sum=%e\n", max, sum);
   end
endmodule // top


© Copyright 1999-2009, Fintronic USA, Inc.   All rights reserved.