Code:
#COMPILER PBWIN #COMPILE EXE #DIM ALL ' %USEMACROS = 1 #INCLUDE "win32api.inc" ' %CACHEBLOCK = &H1000 '; // prefetch chunk SIZE (4K bytes) ' DECLARE FUNCTION CompareMemory CDECL LIB "msvcrt.dll" ALIAS "memcmp" (BYVAL lpbMem1 AS BYTE PTR,BYVAL lpbMem2 AS BYTE PTR,BYVAL num AS DWORD) AS LONG ' FUNCTION ComparePrefetchedBlocksMemory(BYVAL MemAddrA AS BYTE PTR, BYVAL MemAddrB AS BYTE PTR, BYVAL MEM_SIZE AS DWORD) AS LONG LOCAL m, i, p_fetch, m1, m2, even, odd AS DWORD LOCAL a AS DWORD PTR ' 'even = MEM_SIZE \ %CACHEBLOCK odd = MEM_SIZE MOD %CACHEBLOCK ' FUNCTION = %false ' m1 = MemAddrA : m2 = MemAddrB FOR m = 0 TO MEM_SIZE-1 STEP %CACHEBLOCK m1 = MemAddrA + m : m2 = MemAddrB + m a = m1 : GOSUB BLOCK_PREFETCH_4K a = m2 : GOSUB BLOCK_PREFETCH_4K IF CompareMemory(m1, m2, %CACHEBLOCK) THEN FUNCTION = %true : EXIT FUNCTION NEXT IF odd THEN IF CompareMemory(m1, m2, odd) THEN FUNCTION = %true : EXIT FUNCTION END IF EXIT FUNCTION BLOCK_PREFETCH_4K: p_fetch = p_fetch + @a[0] + @a[16] + @a[32] + @a[48] _// Grab every + @a[64] + @a[80] + @a[96] + @a[112] _// 64th address, + @a[128] + @a[144] + @a[160] + @a[176] _// TO hit each + @a[192] + @a[208] + @a[224] + @a[240] '// cache LINE once. a = a + 1024'; // point TO second 1K STRETCH OF addresses p_fetch = p_fetch + @a[0] + @a[16] + @a[32] + @a[48] _ + @a[64] + @a[80] + @a[96] + @a[112] _ + @a[128] + @a[144] + @a[160] + @a[176] _ + @a[192] + @a[208] + @a[224] + @a[240] a = a + 1024'; // point TO third 1K STRETCH OF addresses p_fetch = p_fetch + @a[0] + @a[16] + @a[32] + @a[48] _ + @a[64] + @a[80] + @a[96] + @a[112] _ + @a[128] + @a[144] + @a[160] + @a[176] _ + @a[192] + @a[208] + @a[224] + @a[240] a = a + 1024 '; // point TO fourth 1K STRETCH OF addresses p_fetch = p_fetch + @a[0] + @a[16] + @a[32] + @a[48] _ + @a[64] + @a[80] + @a[96] + @a[112] _ + @a[128] + @a[144] + @a[160] + @a[176] _ + @a[192] + @a[208] + @a[224] + @a[240] RETURN END FUNCTION ' FUNCTION PBMAIN () AS LONG LOCAL s1,s2, sRes AS STRING, cbBuffer AS DWORD, qFreq, qT1,qT2 AS QUAD, lRes AS LONG LOCAL lpb1, lpb2 AS BYTE PTR ' QueryPerformanceFrequency(qFreq) ' cbBuffer = 65536*16*32'+3 ' 32 mb '------------------------------------------- s1 = REPEAT$(cbBuffer,"*") s2 = REPEAT$(cbBuffer,"*") MID$(s1,cbBuffer,1)="K" ' lpb1 = STRPTR(s1) : lpb2 = STRPTR(s2) ' QueryPerformanceCounter(qT1) '********************* lRes = ComparePrefetchedBlocksMemory(lpb1, lpb2, cbBuffer ) QueryPerformanceCounter(qT2) '********************* ' sRes = sRes +"CompareTime with prefecth = "+FORMAT$((qT2-qT1)/qFreq, "#,.000")+" s. Mismatch="+IIF$(lRes,"Yes","No")+$CRLF+REPEAT$(120,"-")+$CRLF '------------------------------------------- s1 = "" : s2 = "" s1 = REPEAT$(cbBuffer,"#") s2 = REPEAT$(cbBuffer,"#") MID$(s1,cbBuffer,1)="W" ' lpb1 = STRPTR(s1) : lpb2 = STRPTR(s2) ' QueryPerformanceCounter(qT1) '********************* lRes = CompareMemory(lpb1, lpb2, cbBuffer ) QueryPerformanceCounter(qT2) '********************* ' sRes = sRes +"CompareTime with NO prefecth = "+FORMAT$((qT2-qT1)/qFreq, "#,.000")+" s. Mismatch="+IIF$(lRes,"Yes","No")+$CRLF+REPEAT$(120,"-")+$CRLF ? sRes END FUNCTION
Leave a comment: