小编Swi*_*ank的帖子

如何对SSE XMM,AVX YMM和ZMM寄存器中的所有32位或64位子寄存器求和?

假设您的任务导致每个浮点子注册表中的小计.我没有看到将小计归结为一个浮点总数的指令.我是否需要将MM寄存器存储在普通的旧存储器中,然后用简单的指令进行求和?

(这些是双精度还是单精度尚未解决,如果我能找到操作码,我计划编码每个CPU变化到即将到来的(?)512位AVX版本.)

sse simd avx

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

非原子<>指针上的原子操作可以比原子<>安全且更快吗?

我有十几个线程读取指针,并且一个线程可能每小时左右更改该指针一次。

读者对时间超级、超级、超级敏感。我听说这个atomic<char**>或其他什么是进入主内存的速度,我想避免这种情况。

在现代(比如2012年及以后)服务器和高端桌面Intel中,8字节对齐的正则指针能否保证正常读写时不会撕裂?我的测试运行了一个小时,没有看到撕裂。

否则,如果我以原子方式进行写入并正常读取,会更好(或更糟)吗?例如通过将两者结合起来?

请注意,还有其他有关混合原子和非原子操作的问题,这些问题没有指定 CPU,并且讨论会转向语言法律主义。这个问题与规范无关,而是关于到底会发生什么,包括我们是否知道在未定义规范的情况下会发生什么。

c++ performance x86-64 c++11 stdatomic

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

C++:当用作逻辑值时如何返回对象的设置状态

我有一些可以设置或不设置的类:

Class obj;
Run Code Online (Sandbox Code Playgroud)

我希望它的值在逻辑中使用时返回是否已设置:

if ( obj )
    obj.Clear();

if ( !obj )
    obj.Set( "foo" );
Run Code Online (Sandbox Code Playgroud)

我想添加到 bool 的隐式转换,但我想知道 int 是否是必要的,或者是否有更好的方法来解决这个问题。

c++ oop operator-overloading c++11

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

C++11:16 字节原子&lt;&gt; 变量是否在 16 字节边界上自动对齐,允许 CMPXCHG16B 指令?

16 字节atomic<>变量是否在 16 字节边界上自动对齐,从而允许编译器/运行时库有效地使用 x86CMPXCHG16B指令?或者我们应该根据风格总是手动指定alignas(16)所有这些变量?

c++ x86-64 memory-alignment compare-and-swap stdatomic

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

C++11 atomic&lt;&gt;:只能用提供的方法读/写?

我编写了一些多线程但无锁的代码,这些代码在较早的支持 C++11 的 GCC(7 或更早版本)上编译并显然执行得很好。原子场是ints 等等。据我所知,我使用普通的 C/C++ 操作a=1;在原子性或事件排序不是问题的地方对它们(等)进行操作。

后来我不得不做一些双宽 CAS 操作,并像常见的那样制作了一个带有指针和计数器的小结构。我尝试执行相同的普通 C/C++ 操作,但出现了变量没有此类成员的错误。(这是您对大多数普通模板的期望,但我半期望atomic以不同的方式工作,部分原因是支持正常的往返分配,据我所知,对于ints。)。

所以两部分问题:

  1. 我们是否应该在所有情况下都使用原子方法,甚至(比如)由一个没有竞争条件的线程完成的初始化?1a) 所以一旦声明为 atomic 就无法非原子地访问?1b)我们还必须使用atomic<>方法的冗长冗长来做到这一点?

  2. 否则,如果至少对于整数类型,我们可以使用普通的 C/C++ 操作。但在这种情况下,这些操作是否与load()/相同,store()或者它们只是正常的分配?

还有一个半元问题:是否有任何关于为什么atomic<>变量不支持普通 C/C++ 操作的见解?我不确定规范中的 C++11 语言是否有能力编写那样的代码,但规范肯定会要求编译器做一些事情,规范中的语言不够强大.

c++ c++11 stdatomic

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