c - C 中 __m128 的段错误

标签 c sse

运行以下简短 C 代码的编译时出现段错误:

#include <pmmintrin.h>
#include <stdio.h>
#include <stdlib.h>
#define VALUE 4242

typedef short int Type;
void threshold(Type *dst, const Type *src, int len)
{
  short int i, N=16;
  short int checkval[] = { VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE };

  const short int* __attribute__ ((aligned (16))) line1;

  __m128i v1, v2, v3:
  v2 = _mm_loadu_si128((__m128i*) checkval );

  for(i = 0; i < len; i+=N)
    {
      line1 = src + N*i;
      //Thisline                                                                                                                                     
      v1 = _mm_loadu_si128((__m128i*) line1 );
      v3 = _mm_cmpgt_epi16( v1, v2 );

      _mm_storeu_si128((__m128i*) (dst + N*i), v3 );

    }
  return;
}

int main()
{
  int N = 1024;
  Type dst[N], src[N];
  int i;
  for(i = 0; i < N; i++)
    src[i] = rand()%VALUE;

  threshold(dst, src, N);
  return 0;
}

我很确定“This line”之后的那一行给我带来了问题,但我无法判断问题是由 line1 不适合 __m128i 还是其他一些错误引起的。

作为一个子问题 - 我尝试对齐第 1 行中的元素,函数 _mm_load_si128 是否更合适(我都尝试过,但我无法避免错误)。

最佳答案

阈值中,

short int i, N=16;

应该是:

short int i, N=8;

这是因为每个 vector 有 8 个 short int 元素,而指针算法考虑了元素的大小(我猜你假设你需要使用 16 个字节作为 vector 的大小?)。

关于c - C 中 __m128 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30355179/

相关文章:

c - 按位 C - 从无符号 int 中解包有符号 10 位数字

c - 为什么这段代码不能识别任何 if 语句?

intel - 将多个 _mm128 与单个条目 _mm256 相乘

assembly - 如何将 4 个 32 位 float 存储到一个 128 位 xmm 寄存器中?

c++ - 内存没有正确对齐?

c - c 中的段错误(核心转储)

c - Visual Studio 和 C 项目上的运行之间不一致

c - 头文件与全局变量的相互包含

c++ - 上证所该向上舍入时向下舍入

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