相关疑难解决方法(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万
查看次数

为什么在x86上对自然对齐的变量进行整数赋值?

我一直在读这篇关于原子操作的文章,它提到了32位整数赋值在x86上是原子的,只要该变量是自然对齐的.

为什么自然对齐确保原子性?

c c++ concurrency x86 atomic

28
推荐指数
2
解决办法
5386
查看次数

了解C ++中的volatile关键字

我试图了解volatile关键字在C ++中的工作方式。

我看了一下“易失性”在C ++中可以防止哪些优化?。查看可接受的答案,看起来像volatile禁用了两种优化

  1. 防止编译器将值缓存在寄存器中。
  2. 在您的程序的POV中似乎不必要的时候,优化对该值的访问。

我在https://en.cppreference.com/w/cpp/language/as_if找到了类似的信息。

对易失性对象的访问(读取和写入)严格按照发生它们的表达式的语义来发生。特别是,它们不会相对于同一线程上的其他易失性访问而重新排序。

我编写了一个简单的C ++程序,该程序对数组中的所有值求和,以比较Plain ints和volatile int的行为。请注意,部分和不会不稳定。

数组由不合格的ints 组成。

int foo(const std::array<int, 4>& input)
{
    auto sum = 0xD;
    for (auto element : input)
    {
        sum += element;
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

阵列由挥发性的int小号

int bar(const std::array<volatile int, 4>& input)
{
    auto sum = 0xD;
    for (auto element : input)
    {
        sum += element;
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

当我查看生成的汇编代码时,仅在纯ints的情况下使用SSE寄存器。据我所知,使用SSE寄存器的代码既没有优化读取,也没有对读取进行重新排序。循环已展开,因此也没有分支。我能解释代码源为何不同的唯一原因是:在发生累积之前,可以对易失性读进行重新排序吗?显然,sum它不是挥发性的。如果这种重新排序不好,是否存在可以说明问题的情况/示例?

使用clang9生成的代码

foo(std::array<int, 4ul> …
Run Code Online (Sandbox Code Playgroud)

c++

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

标签 统计

c ×2

c++ ×2

x86 ×2

assembly ×1

atomic ×1

concurrency ×1

gcc ×1

memcpy ×1