c - 如何对齐 16 位整数以用于 SSE 内在函数

标签 c sse simd memory-alignment sse2

我正在处理定义为 16 位整数的二维数组

int16_t e[MAX_SIZE*MAX_NODE][MAX_SIZE];
int16_t C[MAX_SIZE][MAX_SIZE];

其中 Max_SIZEMAX_NODE 是常数值。我不是专业程序员,但在 StackOverflow 人员的帮助下,我设法编写了一段代码,在我的数据上部署 SSE 指令并实现了显着的加速。目前,我正在使用不需要数据对齐的内部函数(主要是 _mm_loadu_si128_mm_storeu_si128)。

for (b=0; b<n; b+=8){
    v1 = _mm_loadu_si128((__m128i*)&C[level][b]); // level defined elsewhere.
    v2 = _mm_loadu_si128((__m128i*)&e1[node][b]); // node defined elsewhere.
    v3 = _mm_and_si128(v1,v2);
    _mm_storeu_si128((__m128i*)&C[level+1][b],v3);
}

当我将内在函数更改为其对应的对齐数据(即 _mm_load_si128_mm_store_si128)时,我会遇到运行时错误,这让我假设我的数据未正确对齐。

我现在的问题是,如果我的数据没有正确对齐,我该如何对齐才能使用相应的内在函数?我认为由于整数是 16 位,所以它们会自动对齐。但我好像错了!

任何对此的见解都将受到高度赞赏。

谢谢!

最佳答案

SSE 需要数据在 16 字节 边界上对齐,而不是 16 ,这是你的问题。

您正在寻找对齐静态数组的内容取决于编译器。

如果您使用的是 MSVC,则必须使用 __declspec(align(16)) ,或者对于 GCC,这将是 __attribute__((aligned (16))) .

关于c - 如何对齐 16 位整数以用于 SSE 内在函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11067178/

相关文章:

C -> Shell - 阻止写入直到读取

c - 将用户输入数组 append 到文件 [c]

C Readline 函数不工作

c++ - 用于比较 (_mm_cmpeq_ps) 和赋值操作的 SSE 内在函数

c# - Vector<double> 弱 SIMD 性能

parallel-processing - 编译器通常会在没有明确告知的情况下发出向量 (SIMD) 指令吗?

c++ - 从 C++ 调用 C 函数时,如何告诉 gcc 放宽对类型转换的限制?

assembly - 使用监控/等待指令

assembly - 将一个字广播到 xmm 寄存器

c++ - 更快地近似数组的倒数平方根