【问题标题】:Loading an Integer Array into a SIMD register将整数数组加载到 SIMD 寄存器中
【发布时间】:2016-05-08 03:26:59
【问题描述】:

目前我正在尝试使用 SSE 将整数数组加载到 SIMD 寄存器中。 我有一个对齐的 32 位整数数组 Ai 并希望将 4 个连续元素加载到 SIMD 寄存器 Xi 中。但是,在执行_mm_load_si128 之后存储在Xi 中的值是垃圾,除了第一个。

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <immintrin.h>

// number has to be divisible by 4 without remainder
#define VECTOR_SIZE 8

int main() {

    __attribute__((aligned (16))) int32_t *Ai = (int32_t*) malloc(VECTOR_SIZE * sizeof(int32_t));

    for(int i = 0; i < VECTOR_SIZE; i++) {
        Ai[i] = rand() % 100000;
    }

    __m128i Xi;

    for(int i = 0; i < VECTOR_SIZE; i+=4) {
        Xi = _mm_load_si128((__m128i*) &Ai[i]);

        // show content of Xi and Ai
        for(int j = 0; j < 4; j++) {
            printf("Xi[%d] = %d\t Ai[%d] = %d\n", j, Xi[j], i+j, Ai[i+j]);
        }
    }

    free(Ai);
}

这是一个示例输出:

Xi[0] = 16807    Ai[0] = 16807
Xi[1] = 50073    Ai[1] = 75249
Xi[2] = 1489217992   Ai[2] = 50073
Xi[3] = 1346391152   Ai[3] = 43658
Xi[0] = 8930     Ai[4] = 8930
Xi[1] = 27544    Ai[5] = 11272
Xi[2] = 1489217992   Ai[6] = 27544
Xi[3] = 1346391168   Ai[7] = 50878

怎么了?

【问题讨论】:

  • 如果您启用了编译器警告,您会注意到Xi 被视为long long int 的向量,因此在您的printf() 中,Xi[j]long long int,这会导致printf("...%d...",...) 的未定义行为需要 int。在这种情况下,printf() 会截断该值,这会导致它看起来像第一个值是正确的,但实际上不是。

标签: c sse simd


【解决方案1】:

您在提出示例时可能是这个意思:

union {
    __m128i m128;
    int32_t i32[4];
} Xi;

for(int i = 0; i < VECTOR_SIZE; i+=4) {
    Xi.m128 = _mm_load_si128((__m128i*) &Ai[i]);

    // show content of Xi and Ai
    for(int j = 0; j < 4; j++) {
        printf("Xi[%d] = %d\t Ai[%d] = %d\n", j, Xi.i32[j], i+j, Ai[i+j]);
    }
}

这是示例输出:

Xi[0] = 89383    Ai[0] = 89383
Xi[1] = 30886    Ai[1] = 30886
Xi[2] = 92777    Ai[2] = 92777
Xi[3] = 36915    Ai[3] = 36915
Xi[0] = 47793    Ai[4] = 47793
Xi[1] = 38335    Ai[5] = 38335
Xi[2] = 85386    Ai[6] = 85386
Xi[3] = 60492    Ai[7] = 60492

【讨论】:

  • 请注意,__m128i::i32 是一个 MSVC 扩展,不可移植。使用_mm_extract_epi32(vec, 0..3),或在调试器中查看您的向量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2015-07-28
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多