⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 banks.c

📁 代码优化,有效使用内存,透视优化技术,对比优化方法,如果你在追求代码效率的最大化,该资源你不能不读.
💻 C
字号:
/*----------------------------------------------------------------------------
 *
 *						DEMONSTRATION OF THE CONSEQUENCES
 *					OF CACHE BANKS CONFLICT
 *					==================================
 *
 * Build 0x001 04.08.2002
--------------------------------------------------------------------------- */
// configuration
#define BLOCK_SIZE	(8*K)

#include <DoCPU.h>

//============================================================================
//								NO CONFLICTS
//----------------------------------------------------------------------------
//	On P-III
//	========
// !<bank0>!<bank1>!<bank2>!<bank3>!<bank4>!<bank5>!<bank6>!<bank7>!
// !0 1 2 3!4 5 6 7!8 9 0 1!2 3 4 5!6 7 8 9!0 1 2 3!4 5 6 7!8 9 0 1!<- offset
// !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
// !*-*-*-*!       !       !       !       !       ! <<-- ((int)_p32 + a + 0);
// !       !*-*-*-*!       !       !       !       ! <<-- ((int)_p32 + a + 4);
// !       !       !       !*-*-*-*!       !       ! <<-- ((int)_p32 + a +12);
// !       !       !       !       !*-*-*-*!       ! <<-- ((int)_p32 + a +16);
//============================================================================
//
// 袜 AMD Athlon
// =============
// !<--  bank 0 -->!<--  bank 1 -->!<--  bank 2 -->!<--  bank 3 -->!...
// !0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ...
// !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!...
// !*-*-*-*        !               !               ! <<-- ((int)_p32 + a + 2);
// !        *-*-*-*!               !               ! <<-- ((int)_p32 + a + 6);
// !               !        *-*-*-*!               ! <<-- ((int)_p32 + a +12);
// !               !               !*-*-*-*        ! <<-- ((int)_p32 + a +16);
//============================================================================
optimize(int *_p32)
{
	int a;
	int _tmp32 = 0;

	for(a = 0; a < BLOCK_SIZE; a += 32)
	{
			
			_tmp32  += *(int *)((char *)_p32 + a + 0);	// bank 0	[Athlon: bank 0]
			*(int *)((char *)_p32 + a +12) = _tmp32;	// bank 3	[Athlon: bank 1]

			_tmp32  += *(int *)((char *)_p32 + a + 4);	// bank 1	[Athlon: bank 0]
			*(int *)((char *)_p32 + a +16) = _tmp32;	// bank 4	[Athlon: bank 2]
	}
}


//============================================================================
//					DEMONSTRATION OF THE BANKS CONFLICT
//----------------------------------------------------------------------------
//	袜 P-III
//	========
// !<bank0>!<bank1>!<bank2>!<bank3>!<bank4>!<bank5>!<bank6>!<bank7>!
// !0 1 2 3!4 5 6 7!8 9 0 1!2 3 4 5!6 7 8 9!0 1 2 3!4 5 6 7! 8 9 0 1 <- offset
// !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!
// !     *-*-*-*   !       !       !       !       ! <<-- ((int)_p32 + a + 2);
// !       !^    *-*-*-*   !       !       !       ! <<-- ((int)_p32 + a + 6);
// !       !|      !^      !*-*-*-*!       !       ! <<-- ((int)_p32 + a +12);
// !       !|      !|      !       !*-*-*-*!       ! <<-- ((int)_p32 + a +16);
//          |       |
//          +-------+--- <- 饰驮巳室
//============================================================================
//
// On AMD Athlon
// =============
// !<--  bank 0 -->!<--  bank 1 -->!<--  bank 2 -->!<--  bank 3 -->!...
//  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ...
// !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!...
//      *-*-*-*										 <<-- ((int)_p32 + a + 2);
//         ^    *-*-*-*								 <<-- ((int)_p32 + a + 6);
//         |       ^        *-*-*-*					 <<-- ((int)_p32 + a +12);
//         |       |           ^    *-*-*-*			 <<-- ((int)_p32 + a +16);
//         +---+---+           |       ^
//             |               |       |
//             |               +---+---+
//             |                   |
//             +-- <-CONFLICT-> _--+
//============================================================================
conflict(int *_p32)
{
	int a;
	int _tmp32 = 0;

	for(a = 0; a < BLOCK_SIZE; a += 32)
	{
			_tmp32  += *(int *)((char *)_p32 + a + 2);	// bank 0 + 1  [Athlon: bank 0]
			*(int *)((char *)_p32 + a +12) = _tmp32;	// bank 3   *  [Athlon: bank 1]
														//							 *
														// "asterisk" MARK BANKS CONFLICT
														//		*						*
			_tmp32  += *(int *)((char *)_p32 + a + 6);	// bank 1 + 2 [Athlon: bank 0 + 1]
			*(int *)((char *)_p32 + a +16) = _tmp32;	// bank 4	  [Athlon: bank 2]
	}
}


main()
{
	int *_p32;

	// TITLE
	PRINT("= = = Demonstration of the cache banks conflict = = =\n");
	PRINT_TITLE;

	// allocating memory
	_p32 = (int *) _malloc32(BLOCK_SIZE);

	/*------------------------------------------------------------------------
	 *
	 *					PROCESSING DATA WITHOUT CONFLICTS
	 *
	----------------------------------------------------------------------- */
	A_BEGIN(0)
		optimize(_p32);
	A_END(0)

	/*------------------------------------------------------------------------
	 *
	 *					DEMONSTRATION OF THE CACHE BANK CONFLICT
	 *
	----------------------------------------------------------------------- */
	A_BEGIN(1)
		conflict(_p32);
	A_END(1)

	// console output of the results
	Lx_OUT("Conflict",Ax_GET(0), Ax_GET(1));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -