我们可以通过将该对象的点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*
类型吗?这样做我能依靠什么?
我没有特定的用例; 我问这是否真的是英特尔内在函数中的设计缺陷/限制,或者我是否只是遗漏了某些内容.
如果你想将标量浮点数与现有向量相结合,那么在没有高元素归零或使用英特尔内在函数将标量广播到向量中的情况下似乎没有办法实现.我没有研究过GNU C本机向量扩展和相关的内置函数.
如果额外的内在优化了,这不会太糟糕,但它不与gcc(5.4或6.2).也没有好的方法可以使用pmovzx
或insertps
作为负载,因为他们的内在函数只采用向量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) 在现代处理器上,浮点除法比浮点乘法慢一个数量级(以倒数吞吐量衡量)。
我想知道是否有任何算法可以计算到 的快速近似值x/y
,给定某些假设和容差水平。例如,如果您假设0<x<y
,并且愿意接受任何在真实值 10% 以内的输出,那么是否有比内置 FDIV 操作更快的算法?