我想测试两块memmory的速度,我在64位机器(4M缓存)中进行了实验,并且XOR两个内存区域分别对齐32位和64位。我认为64位对齐区域XOR比32位对齐区域XOR快得多,但两种类型XOR的速度相同。
代码:
void region_xor_w32( unsigned char *r1, /* Region 1 */
unsigned char *r2, /* Region 2 */
unsigned char *r3, /* Sum region */
int nbytes) /* Number of bytes in region */
{
uint32_t *l1;
uint32_t *l2;
uint32_t *l3;
uint32_t *ltop;
unsigned char *ctop;
ctop = r1 + nbytes;
ltop = (uint32_t *) ctop;
l1 = (uint32_t *) r1;
l2 = (uint32_t *) r2;
l3 = (uint32_t *) r3;
while (l1 < ltop) {
*l3 = ((*l1) ^ (*l2));
l1++;
l2++;
l3++;
}
}
void region_xor_w64( unsigned char *r1, /* Region 1 */
unsigned char *r2, /* Region 2 */
unsigned char *r3, /* Sum region */
int nbytes) /* Number of bytes in region */
{
uint64_t *l1;
uint64_t *l2;
uint64_t *l3;
uint64_t *ltop;
unsigned char *ctop;
ctop = r1 + nbytes;
ltop = (uint64_t *) ctop;
l1 = (uint64_t *) r1;
l2 = (uint64_t *) r2;
l3 = (uint64_t *) r3;
while (l1 < ltop) {
*l3 = ((*l1) ^ (*l2));
l1++;
l2++;
l3++;
}
}
结果:
答案 0 :(得分:2)
我认为这是由于数据不足造成的。也就是说,你的CPU速度非常快,你的代码非常高效,你的内存子系统根本无法跟上。即使以32位对齐的方式进行异或,也比从内存中获取数据花费的时间更少。这就是为什么32位和64位对齐方法都具有相同的速度 - 即内存子系统的速度。
为了演示,我已经重现了你的实验,但这次有四种不同的XOR方式:
最后一个是通过_mm_xor_si128()实现的,{{3}}是SSE2指令集的一部分。
正如您所看到的,切换到128位处理没有提高性能。另一方面,切换到每字节处理会减慢一切 - 这是因为在这种情况下内存子系统仍然击败CPU。