我的任务是评估各种ARM处理器(基准测试),特别是片上系统(SOC)。有些SOC有很多数据缓存,有些则很少。因此,我希望我的程序能够阻止数据缓存。
我写过一个Walk 1测试,它访问核心外部的内存,但是在SOC上。我将在我们目前的处理器上运行它,它具有非常少的数据缓存,并在具有大量数据缓存的Cortex M3处理器上运行。
我专注于持续时间来获取处理器外部的内存。如果我将Walking 1的内存大小设置为大于数据缓存的大小,则运行测试" exponentiates"及时。例如,对于小尺寸的内存,测试在几分钟内运行,对于更大的内存大小,测试需要数小时。
问题:是否存在可用于阻止处理器将整个阵列加载到处理器数据缓存中的习惯用法?
(注意:这被标记为C和C ++,因为我可以选择在语言之间进行选择。如果C没有成语,但是C ++没有,那么我将首先尝试使用C ++。)
答案 0 :(得分:2)
除非您的编译器提供访问内存区域保护寄存器的函数,否则您需要进行一些汇编以将内存区域设置为不可缓存:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0290g/Chdhdahb.html
或如下所述,通过c1控制寄存器的第2位和第12位全局禁用第一级数据和指令高速缓存,通过协处理器寄存器15 = CP 15访问:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0338g/Babebdcb.html
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0338g/Babgdhif.html
这假设您的ARM处理器具有CP 15功能。可能有其他控制寄存器可能对您的测试有用。我不确定在没有CP 15功能的ARM处理器上如何做到这一点。
答案 1 :(得分:1)
如果你不能知道@rcglfr所说的话,你可以按照缓存行的大小迭代数据。
答案 2 :(得分:1)
为了避免修改您的MMU表,您可能只是禁用数据缓存(如果您有1,则禁用L2缓存)。
在ARM926EJ-S上,完成如下:
// Enable the data cache
FUNC_START_ARM(hal_dcache_enable,r1)
push {lr}
mov r0,#0
mcr p15,0,r0,c7,c6,0 /* invalidate d-cache */
mrc p15,0,r1,c1,c0,0
orr r1,r1,#0xC
/* enable DCache and write buffer */
mcr p15,0,r1,c1,c0,0
pop {lr}
bx lr
// Disable the data cache (and invalidate it, required semantics)
FUNC_START_ARM(hal_dcache_disable,r1)
push {lr}
1: mrc p15,0,r15,c7,c14,3
bne 1b
mrc p15,0,r1,c1,c0,0
bic r1,r1,#0xC
/* disable DCache AND write buffer */
mcr p15,0,r1,c1,c0,0
mov r1,#0
mcr p15,0,r1,c7,c6,0 /* clear data cache */
pop {lr}
bx lr
只需查看ARM体系结构参考手册,了解如何在ARM上禁用d-cache。
启用/禁用缓存时,请务必遵循ARM有关缓存失效的指导原则(取决于您的ARM内核)
答案 3 :(得分:0)
在与同事交谈之后,我们将保留数据和指令缓存。
评估是为了提高Cortex系列和ARM7TDMI处理器之间的性能。很大一部分改进是缓存。
总之,要禁用缓存,必须使用汇编语言。没有高级语言习惯用法来阻止CPU使用缓存。 CPU旨在充分利用数据和指令缓存。