相关疑难解决方法(0)

为memcpy增强了REP MOVSB

我想使用增强的REP MOVSB(ERMSB)为自定义获得高带宽memcpy.

ERMSB引入了Ivy Bridge微体系结构.如果您不知道ERMSB是什么,请参阅英特尔优化手册中的"增强型REP MOVSB和STOSB操作(ERMSB)" 部分.

我知道直接执行此操作的唯一方法是使用内联汇编.我从https://groups.google.com/forum/#!topic/gnu.gcc.help/-Bmlm_EG_fE获得了以下功能

static inline void *__movsb(void *d, const void *s, size_t n) {
  asm volatile ("rep movsb"
                : "=D" (d),
                  "=S" (s),
                  "=c" (n)
                : "0" (d),
                  "1" (s),
                  "2" (n)
                : "memory");
  return d;
}
Run Code Online (Sandbox Code Playgroud)

然而,当我使用它时,带宽远小于memcpy. 使用我的i7-6700HQ(Skylake)系统,Ubuntu 16.10,DDR4 @ 2400 MHz双通道32 GB,GCC 6.2,__movsb获得15 GB/s并memcpy获得26 GB/s.

为什么带宽如此低REP MOVSB?我该怎么做才能改善它?

这是我用来测试它的代码.

//gcc -O3 -march=native -fopenmp foo.c
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly gcc memcpy

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

提示编译器可以使用对齐的memcpy

我有一个由7个__m256值组成的结构,它在内存中以32字节对齐的方式存储.

typedef struct
{
        __m256 xl,xh;
        __m256 yl,yh;
        __m256 zl,zh;
        __m256i co;
} bloxset8_t;
Run Code Online (Sandbox Code Playgroud)

我通过使用posix_memalign()动态分配数据的函数或使用(aligned(32))静态分配数据的属性来实现32字节对齐.

对齐很好,但是当我使用两个指向这样的结构的指针,并将它们作为memcpy()的目标和源传递时,编译器决定使用它__memcpy_avx_unaligned()来复制.

我如何强制clang使用对齐的avx memcpy函数,我认为这是更快的变体?

操作系统:Ubuntu 16.04.3 LTS,Clang:3.8.0-2ubuntu4.

UPDATE
仅在复制两个或多个结构时调用__memcpy_avx_unaligned().当只复制一个时,clang会发出14个vmovup指令.

c glibc memory-alignment memcpy avx

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

x86微体系结构/ SIMD市场份额

哪里可以找到有关x86微体系结构"市场份额"的数据?x86系列CPU的用户有多少百分比拥有支持SSE4.2,AVX,AVX2等的CPU?

我正在为我的程序分发预编译的二进制文件,我想知道什么是最佳的优化目标,以及在没有运行时检查的情况下可以合理使用哪些SIMD扩展.

我可以找到整体的英特尔与AMD市场份额数据,但不是几代英特尔和AMD的CPU细分.理想情况下,我也希望按操作系统和每个国家/地区进行细分,但即使是微体系结构的全局统计数据也会比没有更好.

x86 sse simd instruction-set baseline

3
推荐指数
1
解决办法
197
查看次数

标签 统计

c ×2

memcpy ×2

x86 ×2

assembly ×1

avx ×1

baseline ×1

gcc ×1

glibc ×1

instruction-set ×1

memory-alignment ×1

simd ×1

sse ×1