瀏覽代碼

Array alignment problem: for arrays with size multiple of 32 the space allocated can become too small. fixed.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7399 8c9fc860-2736-0410-a75d-ab315db34111
felixf 7 年之前
父節點
當前提交
84180f09bd
共有 1 個文件被更改,包括 15 次插入10 次删除
  1. 15 10
      source/FoxArrayBase.Mod

+ 15 - 10
source/FoxArrayBase.Mod

@@ -43,6 +43,8 @@ CONST
 	GeometryMismatch = 400;
 	GeometryMismatch = 400;
 	DimensionMismatch=401;
 	DimensionMismatch=401;
 	AllocationForbidden=402;
 	AllocationForbidden=402;
+	
+	ArrayAlignment=8;
 
 
 	TensorFlag = 0;  RangeFlag = 1;  TemporaryFlag = 2;
 	TensorFlag = 0;  RangeFlag = 1;  TemporaryFlag = 2;
 
 
@@ -233,7 +235,6 @@ VAR
 	END PutAdr;
 	END PutAdr;
 	
 	
 	PROCEDURE Align(value: ADDRESS): ADDRESS;
 	PROCEDURE Align(value: ADDRESS): ADDRESS;
-	CONST ArrayAlignment = 8;
 	BEGIN RETURN value + (-value) MOD ArrayAlignment;
 	BEGIN RETURN value + (-value) MOD ArrayAlignment;
 	END Align;
 	END Align;
 	
 	
@@ -1505,7 +1506,7 @@ Sufficient (but not necessary) conditions:
 				DEC( dim );  len := GetLen( src, dim );  PutLen( dest, dim, len );
 				DEC( dim );  len := GetLen( src, dim );  PutLen( dest, dim, len );
 				PutInc( dest, dim, size );  size := size * len;
 				PutInc( dest, dim, size );  size := size * len;
 			END;
 			END;
-			SYSTEM.NEW( data, size );
+			SYSTEM.NEW( data, size + ArrayAlignment);
 			PutAdr( dest, Align(data));
 			PutAdr( dest, Align(data));
 			PutPtr( dest, data );
 			PutPtr( dest, data );
 		END NewData;
 		END NewData;
@@ -8032,7 +8033,7 @@ TYPE
 		(*
 		(*
 		KernelLog.String( "ALLOCATE MATRIX WAS CALLED" );  KernelLog.Ln;
 		KernelLog.String( "ALLOCATE MATRIX WAS CALLED" );  KernelLog.Ln;
 		*)
 		*)
-		SYSTEM.NEW( p, rows * cols * elementsize );  PutLen( dest, 1, cols );
+		SYSTEM.NEW( p, rows * cols * elementsize  + ArrayAlignment);  PutLen( dest, 1, cols );
 		PutLen( dest, 0, rows );  PutInc( dest, 1, elementsize );
 		PutLen( dest, 0, rows );  PutInc( dest, 1, elementsize );
 		PutInc( dest, 0, elementsize * cols );  PutAdr( dest, Align(p) );
 		PutInc( dest, 0, elementsize * cols );  PutAdr( dest, Align(p) );
 		PutPtr( dest, p);  RETURN p;
 		PutPtr( dest, p);  RETURN p;
@@ -8041,7 +8042,7 @@ TYPE
 	PROCEDURE AllocateVector( dest: ADDRESS;  l0, elementsize: LONGINT ): ANY;
 	PROCEDURE AllocateVector( dest: ADDRESS;  l0, elementsize: LONGINT ): ANY;
 	VAR p: ANY;
 	VAR p: ANY;
 	BEGIN
 	BEGIN
-		SYSTEM.NEW( p, l0 * elementsize );  PutLen( dest, 0, l0 );
+		SYSTEM.NEW( p, l0 * elementsize  + ArrayAlignment);  PutLen( dest, 0, l0 );
 		PutInc( dest, 0, elementsize );  PutAdr( dest, Align(p) );
 		PutInc( dest, 0, elementsize );  PutAdr( dest, Align(p) );
 		PutPtr( dest, p );  RETURN p;
 		PutPtr( dest, p );  RETURN p;
 	END AllocateVector;
 	END AllocateVector;
@@ -9268,7 +9269,7 @@ TYPE
 				len := GetLen( src, max-dim );  PutLen( dest, dim, len );
 				len := GetLen( src, max-dim );  PutLen( dest, dim, len );
 				PutInc( dest, dim, size );  size := size * len;
 				PutInc( dest, dim, size );  size := size * len;
 			END;
 			END;
-			SYSTEM.NEW( data, size );
+			SYSTEM.NEW( data, size  + ArrayAlignment);
 			PutAdr( dest, Align(data) );
 			PutAdr( dest, Align(data) );
 			PutPtr( dest, data );
 			PutPtr( dest, data );
 		END NewData;
 		END NewData;
@@ -9328,7 +9329,7 @@ TYPE
 			len0 := GetLen( left, 0 );  len1 := GetLen( left, 1 );
 			len0 := GetLen( left, 0 );  len1 := GetLen( left, 1 );
 			p := AllocateTransposed(dest,left,Size);
 			p := AllocateTransposed(dest,left,Size);
 			IF Overlap( left, dest ) THEN  (* copy data first, then transpose *)
 			IF Overlap( left, dest ) THEN  (* copy data first, then transpose *)
-				SYSTEM.NEW( p, len0 * len1 * Size );  dinc0 := Size;  dinc1 := len0 * Size;
+				SYSTEM.NEW( p, len0 * len1 * Size  + ArrayAlignment);  dinc0 := Size;  dinc1 := len0 * Size;
 				dadr := Align(p);  linc0 := GetIncr( left, 0 );
 				dadr := Align(p);  linc0 := GetIncr( left, 0 );
 				linc1 := GetIncr( left, 1 );  ladr := GetAdr( left );
 				linc1 := GetIncr( left, 1 );  ladr := GetAdr( left );
 				WHILE (len0 > 0) DO
 				WHILE (len0 > 0) DO
@@ -9535,7 +9536,7 @@ TYPE
 				len := shape[i];  PutInc( new, i, size );  PutLen( new, i, len );
 				len := shape[i];  PutInc( new, i, size );  PutLen( new, i, len );
 				size := size * len;
 				size := size * len;
 			END;
 			END;
-			SYSTEM.NEW( data, size );   (* Zero(data,size*Size); *)
+			SYSTEM.NEW( data, size  + ArrayAlignment);   (* Zero(data,size*Size); *)
 			PutAdr( new, Align(data) );
 			PutAdr( new, Align(data) );
 			PutPtr( new, data );  PutDim( new, newDim );
 			PutPtr( new, data );  PutDim( new, newDim );
 			PutSize( new, Size );
 			PutSize( new, Size );
@@ -9698,8 +9699,9 @@ TYPE
 				len := a[i];
 				len := a[i];
 				PutInc( dest, i, size );  PutLen( dest, i, len );  size := size * len;
 				PutInc( dest, i, size );  PutLen( dest, i, len );  size := size * len;
 			END;
 			END;
+			TRACE(size,tag);
 			IF tag = 0 THEN
 			IF tag = 0 THEN
-				SYSTEM.NEW( data, size );   (* Zero(data,size*Size); *)
+				SYSTEM.NEW( data, size  + ArrayAlignment);   (* Zero(data,size*Size); *)
 				dest.adr := Align(data);
 				dest.adr := Align(data);
 			ELSE
 			ELSE
 				Heaps.NewArr(data, tag, size DIV elementSize,1,FALSE);
 				Heaps.NewArr(data, tag, size DIV elementSize,1,FALSE);
@@ -9716,6 +9718,7 @@ TYPE
 
 
 	BEGIN
 	BEGIN
 		dim := LEN( a,0 );
 		dim := LEN( a,0 );
+		TRACE(dest, dim);
 		IF (dest = 0) OR (dim # GetDim( dest )) THEN
 		IF (dest = 0) OR (dim # GetDim( dest )) THEN
 			IF dest # 0 THEN
 			IF dest # 0 THEN
 				IF (~(TensorFlag IN GetFlags( dest ))) THEN Err( "Array's number of dimension must not be modified (no TENSOR !)" );  END;
 				IF (~(TensorFlag IN GetFlags( dest ))) THEN Err( "Array's number of dimension must not be modified (no TENSOR !)" );  END;
@@ -9726,6 +9729,7 @@ TYPE
 			Heaps.SetPC(data);
 			Heaps.SetPC(data);
 		ELSE
 		ELSE
 			i := 0;
 			i := 0;
+			same := TRUE;
 			WHILE (i < dim) & same DO
 			WHILE (i < dim) & same DO
 				IF GetLen( dest, i ) # a[i] THEN same := FALSE;  END;
 				IF GetLen( dest, i ) # a[i] THEN same := FALSE;  END;
 				INC( i );
 				INC( i );
@@ -9741,6 +9745,7 @@ TYPE
 
 
 	PROCEDURE AllocateArrayA*( CONST a: ARRAY OF SIZE;  elementSize: SIZE; tag: ADDRESS; dest: UnsafeArray );
 	PROCEDURE AllocateArrayA*( CONST a: ARRAY OF SIZE;  elementSize: SIZE; tag: ADDRESS; dest: UnsafeArray );
 	BEGIN
 	BEGIN
+		TRACE(elementSize);
 		AllocateTensorA(a,elementSize,tag,dest);
 		AllocateTensorA(a,elementSize,tag,dest);
 		IF dest.ptr # NIL THEN Heaps.SetPC(dest.ptr) END;
 		IF dest.ptr # NIL THEN Heaps.SetPC(dest.ptr) END;
 	END AllocateArrayA;
 	END AllocateArrayA;
@@ -9760,7 +9765,7 @@ TYPE
 				PutInc( dest, i, size );  PutLen( dest, i, len );  size := size * len;
 				PutInc( dest, i, size );  PutLen( dest, i, len );  size := size * len;
 			END;
 			END;
 			IF tag = 0 THEN
 			IF tag = 0 THEN
-				SYSTEM.NEW( data, size );   (* Zero(data,size*Size); *)
+				SYSTEM.NEW( data, size  + ArrayAlignment);   (* Zero(data,size*Size); *)
 				PutAdr( dest, Align(data) );
 				PutAdr( dest, Align(data) );
 			ELSE
 			ELSE
 				Heaps.NewArr(data, tag, size DIV Size,1,FALSE);
 				Heaps.NewArr(data, tag, size DIV Size,1,FALSE);
@@ -9854,7 +9859,7 @@ TYPE
 			FOR i := 0 TO rdim - 1 DO
 			FOR i := 0 TO rdim - 1 DO
 				len := GetLen( right, i );  size := size * len;  PutLen( dest, ldim + i, len );
 				len := GetLen( right, i );  size := size * len;  PutLen( dest, ldim + i, len );
 			END;
 			END;
-			SYSTEM.NEW( data, size * Size );   (* Zero(data,size*Size); *)
+			SYSTEM.NEW( data, size * Size  + ArrayAlignment);   (* Zero(data,size*Size); *)
 			(*
 			(*
 			KernelLog.String("adr data="); KernelLog.Int(SYSTEM.VAL(LONGINT,data),10); KernelLog.Ln;
 			KernelLog.String("adr data="); KernelLog.Int(SYSTEM.VAL(LONGINT,data),10); KernelLog.Ln;
 			KernelLog.String("adr dest="); KernelLog.Int(dest,10); KernelLog.Ln;
 			KernelLog.String("adr dest="); KernelLog.Int(dest,10); KernelLog.Ln;