相关疑难解决方法(0)

何时以及如何允许转换为char指针?

我们可以通过将该对象的点T转换为a 来查看类型T*对象的表示char*.至少在实践中:

int x = 511;
unsigned char* cp = (unsigned char*)&x;
std::cout << std::hex << std::setfill('0');
for (int i = 0; i < sizeof(int); i++) {
  std::cout << std::setw(2) << (int)cp[i] << ' ';
}
Run Code Online (Sandbox Code Playgroud)

这输出511我的系统的表示:ff 01 00 00.

(肯定)这里发生了一些实现定义的行为.哪个演员阵容允许我将一个转换int*为一个unsigned char*转换,哪个转换是否需要转换?我一投演就调用了未定义的行为?我可以投这样的任何T*类型吗?这样做我能依靠什么?

c++ memory casting representation

20
推荐指数
2
解决办法
3928
查看次数

如何在没有编译器浪费指令归零上层元素的情况下将标量合并到向量中?英特尔内在函数的设计限制?

我没有特定的用例; 我问这是否真的是英特尔内在函数中的设计缺陷/限制,或者我是否只是遗漏了某些内容.

如果你想将标量浮点数与现有向量相结合,那么在没有高元素归零或使用英特尔内在函数将标量广播到向量中的情况下似乎没有办法实现.我没有研究过GNU C本机向量扩展和相关的内置函数.

如果额外的内在优化了,这不会太糟糕,但它不与gcc(5.4或6.2).也没有好的方法可以使用pmovzxinsertps作为负载,因为他们的内在函数只采用向量args的相关原因.(并且gcc不会将标量 - >向量加载到asm指令中.)

__m128 replace_lower_two_elements(__m128 v, float x) {
  __m128 xv = _mm_set_ss(x);        // WANTED: something else for this step, some compilers actually compile this to a separate insn
  return _mm_shuffle_ps(v, xv, 0);  // lower 2 elements are both x, and the garbage is gone
}
Run Code Online (Sandbox Code Playgroud)

gcc 5.3 -march = nehalem -O3输出,启用SSE4.1并调整该Intel CPU :(没有SSE4.1会更糟;多个指令将上层元素归零).

    insertps  xmm1, xmm1, 0xe    # pointless zeroing of upper elements.  shufps only reads the low element of xmm1 …
Run Code Online (Sandbox Code Playgroud)

c x86 gcc sse intrinsics

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

快速近似浮点除法

在现代处理器上,浮点除法比浮点乘法慢一个数量级(以倒数吞吐量衡量)。

我想知道是否有任何算法可以计算到 的快速近似值x/y,给定某些假设和容差水平。例如,如果您假设0<x<y,并且愿意接受任何在真实值 10% 以内的输出,那么是否有比内置 FDIV 操作更快的算法?

c++ division

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

标签 统计

c++ ×2

c ×1

casting ×1

division ×1

gcc ×1

intrinsics ×1

memory ×1

representation ×1

sse ×1

x86 ×1