相关疑难解决方法(0)

为什么不直接访问__m128i字段?

在MSDN上阅读这篇文章,它说

您不应直接访问__m128i字段.但是,您可以在调试器中看到这些类型.__m128i类型的变量映射到XMM [0-7]寄存器.

但是,它没有解释原因.为什么?例如,以下是"坏":

void func(unsigned short x, unsigned short y)
{
    __m128i a;
    a.m128i_i64[0] = x;

    __m128i b;
    b.m128i_i64[0] = y;

    // Now do something with a and b ...
}
Run Code Online (Sandbox Code Playgroud)

如果使用某种load功能,而不是像上面的例子那样进行分配?

c++ sse intrinsics

5
推荐指数
1
解决办法
1108
查看次数

为什么在AMD64上对mmap内存的未对齐访问有时会出现段错误?

我有这段代码在AMD64兼容CPU上运行Ubuntu 14.04时会出现段错误:

#include <inttypes.h>
#include <stdlib.h>

#include <sys/mman.h>

int main()
{
  uint32_t sum = 0;
  uint8_t *buffer = mmap(NULL, 1<<18, PROT_READ,
                         MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
  uint16_t *p = (buffer + 1);
  int i;

  for (i=0;i<14;++i) {
    //printf("%d\n", i);
    sum += p[i];
  }

  return sum;
}
Run Code Online (Sandbox Code Playgroud)

如果使用分配内存,则仅此段错误mmap.如果我使用malloc,堆栈上的缓冲区,或全局变量,它不会段错误.

如果我将循环的迭代次数减少到少于14的次数,则不再是段错误.如果我从循环内打印数组索引,它也不再是段错误.

为什么未对齐的内存访问能够访问未对齐地址的CPU上的段错误,为什么只有在这种特定情况下呢?

c gcc mmap x86-64 auto-vectorization

5
推荐指数
1
解决办法
1608
查看次数

在 AVX 寄存器 (__m256i) 中设置单个位,需要“随机访问”运算符

所以,我想设置一个__m256i寄存器的单个位。

说,我的__m256icontains: [ 1 0 1 0 | 1 0 1 0 | ... | 1 0 1 0 ],我如何设置和取消设置第 n 位?

x86 bit-manipulation simd intrinsics avx

4
推荐指数
1
解决办法
1836
查看次数

标签 统计

intrinsics ×2

auto-vectorization ×1

avx ×1

bit-manipulation ×1

c ×1

c++ ×1

gcc ×1

mmap ×1

simd ×1

sse ×1

x86 ×1

x86-64 ×1