考虑x86 CPU上的单个内存访问(单个读取或单个写入,而不是读写)。该指令正在访问16个字节(128位)的存储器,并且所访问的存储器位置与16个字节对齐。
文档“英特尔®64架构内存订购白皮书”指出,对于“读取或写入地址在8字节边界上对齐的四字(8字节)的指令”,内存操作似乎作为单个内存访问执行内存类型。
问题:是否存在Intel / AMD / etc x86 CPU,它们保证对16个字节边界对齐的16个字节(128位)的读写操作作为单个内存访问执行?是的,它是哪种特定类型的CPU(Core2 / Atom / K8 / Phenom / ...)?如果您提供此问题的答案(是/否),请同时指定用于确定答案的方法 -PDF文档查找,蛮力测试,数学证明或其他用于确定答案的方法。
此问题与诸如http://research.swtch.com/2010/02/off-to-races.html的问题有关
更新:
我用C创建了一个简单的测试程序,您可以在计算机上运行该程序。请在您的Phenom,Athlon,Bobcat,Core2,Atom,Sandy Bridge或任何具有SSE2功能的CPU上编译并运行它。谢谢。
// Compile with:
// gcc -o a a.c -pthread -msse2 -std=c99 -Wall -O2
//
// Make sure you have at least two physical CPU cores or hyper-threading.
#include <pthread.h>
#include <emmintrin.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
typedef int v4si __attribute__ ((vector_size (16)));
volatile v4si x;
unsigned n1[16] __attribute__((aligned(64)));
unsigned n2[16] __attribute__((aligned(64)));
void* thread1(void *arg) {
for (int i=0; i<100*1000*1000; i++) {
int mask = _mm_movemask_ps((__m128)x);
n1[mask]++;
x = (v4si){0,0,0,0};
}
return NULL;
}
void* thread2(void *arg) {
for (int i=0; i<100*1000*1000; i++) {
int mask = _mm_movemask_ps((__m128)x);
n2[mask]++;
x = (v4si){-1,-1,-1,-1};
}
return NULL;
}
int main() {
// Check memory alignment
if ( (((uintptr_t)&x) & 0x0f) != 0 )
abort();
memset(n1, 0, sizeof(n1));
memset(n2, 0, sizeof(n2));
pthread_t t1, t2;
pthread_create(&t1, NULL, thread1, NULL);
pthread_create(&t2, NULL, thread2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
for (unsigned i=0; i<16; i++) {
for (int j=3; j>=0; j--)
printf("%d", (i>>j)&1);
守候你守候我
慕妹3242003