gpt4 book ai didi

gcc - 如何在gcc中静态初始化__m128i数组?

转载 作者:行者123 更新时间:2023-12-04 07:55:44 26 4
gpt4 key购买 nike

我正在将一些SSE优化代码从Windows移植到Linux。而且我发现以下在MSVC中运行良好的代码在GCC中不起作用。

该代码将初始化__m128i数组。每个__mi28i包含16个int8_t。它确实用gcc编译,但结果与预期不符。

实际上,当gcc将__m128i定义为long long int时,该代码将初始化一个数组,如下所示:
long long int coeffs_ssse3[4] = {64, 83, 64, 36}

我在Google上搜索,并被告知“初始化向量的唯一可移植方法是使用_mm_set_XXX内部函数”。但是,我想知道还有其他方法可以初始化__m128i数组吗?静态上更好,并且不需要大量修改以下代码(因为我拥有以下格式的大量代码)。任何建议表示赞赏。

static const __m128i coeffs_ssse3[4] =
{
{ 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0},
{ 83, 0, 36, 0,-36,-1,-83,-1, 83, 0, 36, 0,-36,-1,-83, -1},
{ 64, 0,-64,-1,-64,-1, 64, 0, 64, 0,-64,-1,-64,-1, 64, 0},
{ 36, 0,-83,-1, 83, 0,-36,-1, 36, 0,-83,-1, 83, 0,-36,-1}
};

最佳答案

看来gcc并未将__m128*类型视为集合初始化的候选者。由于它们不是标准类型,因此此行为在编译器之间会有所不同。一种方法是将数组声明为8位整数的对齐数组,然后仅将指针强制转换为该数组:

static const int8_t coeffs[64] __attribute__((aligned(16))) =
{
64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0,
83, 0, 36, 0,-36,-1,-83,-1, 83, 0, 36, 0,-36,-1,-83, -1,
64, 0,-64,-1,-64,-1, 64, 0, 64, 0,-64,-1,-64,-1, 64, 0,
36, 0,-83,-1, 83, 0,-36,-1, 36, 0,-83,-1, 83, 0,-36,-1
};
static const __m128i *coeffs_ssse3 = (__m128i *) coeffs;

但是,我认为Visual Studio不支持此语法( __attribute__((aligned(x)))),因此您将需要使用一些 #ifdef技巧来使用正确的指令来在所有目标平台上实现所需的对齐方式。

关于gcc - 如何在gcc中静态初始化__m128i数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15499251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com