相关疑难解决方法(0)

SSE指令:哪些CPU可以进行原子16B内存操作?

考虑在x86 CPU上进行单个内存访问(单个读取或单个写入,而不是读取或写入)SSE指令.该指令访问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++) { …
Run Code Online (Sandbox Code Playgroud)

concurrency x86 sse atomic thread-safety

30
推荐指数
3
解决办法
7100
查看次数

MOVDQA和MOVAPS x86指令之间的区别?

我正在寻找英特尔数据表:英特尔®64和IA-32架构软件开发人员手册 ,我找不到它们之间的区别

  • MOVDQA:移动对齐双四字
  • MOVAPS:移动对齐打包单精度

在英特尔数据表中,我可以找到两个指令:

该指令可用于从128位存储器位置加载XMM寄存器,将XMM寄存器的内容存储到128位存储器位置,或在两个XMM寄存器之间移动数据.

唯一的区别是:

要将双四字移入或移出未对齐的存储单元,请使用MOVDQU指令.

要将打包的单精度浮点值移入或移出未对齐的内存位置,请使用MOVUPS指令.

但是我找不到两个不同指令的原因?

那么有人可以解释这个区别吗?

x86 assembly sse mov

28
推荐指数
1
解决办法
1万
查看次数

AVX指令vxorpd和vpxor之间的区别

根据英特尔内部指南,

  • vxorpd ymm, ymm, ymm:计算a和b中打包的双精度(64位)浮点元素的按位XOR,并将结果存储在dst中.
  • vpxor ymm, ymm, ymm:计算a和b中256位(表示整数数据)的按位XOR,并将结果存储在dst中.

两者有什么区别?在我看来,两个指令都会对ymm寄存器的所有256位执行按位异或.如果我使用vxorpd整数数据会有任何性能损失(反之亦然)?

intel simd vectorization xor avx

10
推荐指数
1
解决办法
2722
查看次数

标签 统计

sse ×2

x86 ×2

assembly ×1

atomic ×1

avx ×1

concurrency ×1

intel ×1

mov ×1

simd ×1

thread-safety ×1

vectorization ×1

xor ×1