小编pla*_*cel的帖子

C++ std :: set和std :: multiset

在C++中默认情况下都std::setstd::multisetstd::less<T>作为他们的比较.任何人都可以解释如何std::multiset允许重复,std::set不是吗?

c++ containers std set multiset

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

AVX中的AVX2 VPSHUFB仿真

在AVX中,只有128位 PSHUFB

VPSHUFB xmm1, xmm2, xmm3/m128
Run Code Online (Sandbox Code Playgroud)

只有AVX2 PSHUFB才能满足整个256位AVX寄存器的要求

VPSHUFB ymm1, ymm2, ymm3/m256
Run Code Online (Sandbox Code Playgroud)

如何使用AVX内在函数有效地模拟该指令?

同样在这种特殊情况下,源只有8个元素(字节),但这些元素可以在目的地的整个32字节内移动.所以只运行2 x就没问题了PSHUFB.

我发现的一个问题VPSHUFB是它将16(0x10)视为0,只有128和up填充为零!(最高位设置)是否可以在不添加比较和屏蔽的情况下执行此操作?

x86 simd intrinsics avx

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

IEEE 754浮点加法和乘法的互换性

添加是否x + x可以通过IEEE 754(IEC 559)浮点标准中的乘法2 * x进行互换,或者更一般地说,是否有任何保证并始终给出完全相同的结果?case_addcase_mul

#include <limits>

template <typename T>
T case_add(T x, size_t n)
{
    static_assert(std::numeric_limits<T>::is_iec559, "invalid type");

    T result(x);

    for (size_t i = 1; i < n; ++i)
    {
        result += x;
    }

    return result;
}

template <typename T>
T case_mul(T x, size_t n)
{
    static_assert(std::numeric_limits<T>::is_iec559, "invalid type");

    return x * static_cast<T>(n);
}
Run Code Online (Sandbox Code Playgroud)

c++ floating-point ieee-754 numerical-stability

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

如何将XMM 128位寄存器拆分为两个64位整数寄存器?

如何将128位xmm寄存器拆分为两个64位quadwords?

我输入的字数非常多xmm1,想要将较高的四字r9和较低的四字输入r10,或RAXRDX

movlpdmovhpd仅与reg到mem兼容,反之亦然。

x86 assembly sse

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

如何使用SSE高效执行int8/int64转换?

我正在实现SSE类型之间的转换,我发现为SSE4.1之前的目标实现int8-> int64扩展转换非常麻烦.

简单的实施将是:

inline __m128i convert_i8_i64(__m128i a)
{
#ifdef __SSE4_1__
    return _mm_cvtepi8_epi64(a);
#else
    a = _mm_unpacklo_epi8(a, a);
    a = _mm_unpacklo_epi16(a, a);
    a = _mm_unpacklo_epi32(a, a);
    return _mm_srai_epi64(a, 56); // missing instrinsic!
#endif
}
Run Code Online (Sandbox Code Playgroud)

但是因为_mm_srai_epi64在AVX-512之前不存在,所以此时有两种选择:

  • 实施_mm_srai_epi64,或
  • convert_i8_i64以不同的方式实施.

我不确定哪一个是最有效的解决方案.任何的想法?

c++ x86 sse simd intrinsics

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

作为有理数的浮点数的精确值

我正在寻找一种将浮点数的精确值转换为两个整数有理商的方法,即a / b其中b不大于指定的最大分母b_max。如果b <= b_max不可能满足条件,则结果回退到仍然满足条件的最佳近似值。

坚持,稍等。这里有很多关于截断实的最佳有理近似的问题/答案,该数表示为浮点数。但是,我对浮点数的确切值感兴趣,它本身就是一个具有不同表示形式的有理数。更具体地说,浮点数的数学集合是有理数的子集。在 IEEE 754 二进制浮点标准的情况下,它是二元有理数的子集。无论如何,任何浮点数都可以转换为两个有限精度整数的有理商,如。a / b

因此,例如假设 IEEE 754 单精度二进制浮点格式,有理等价的float f = 1.0f / 3.0f不是1 / 3,而是11184811 / 33554432。这是 的精确f,它是来自 IEEE 754 单精度二进制浮点数数学集合的一个数字。

根据我的经验,遍历(通过二分搜索)Stern-Brocot 树在这里没有用,因为当它被解释为截断的实数而不是精确的浮点数时,这更适合于逼近浮点数的值理性的

可能,连分数是要走的路。

这里的另一个问题是整数溢出。想想我们要把有理数表示为二的商int32_t,其中最大的分母b_max = …

c++ floating-point rational-number numerical-methods continued-fractions

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

在 clang 11 上显式模板实例化期间的编译器段错误

以下显式模板实例化导致编译器前端段错误在 LLVM clang++ 11.0on 下x86_64-pc-windows-msvc,使用clang-cl接口 with -std=c++17,无论优化级别如何。

A.h

template <typename T>
class A
{
public:

    T value;

    static constexpr auto address = &A<T>::value;
};

extern template class A<float>;
Run Code Online (Sandbox Code Playgroud)

A.cpp

#include "A.h"

template class A<float>;
Run Code Online (Sandbox Code Playgroud)

请注意,由于 C++17A::address内联变量,因此 ODR 使用在这里不会成为问题。

编译器行为显然是错误的,我已经在 LLVM 错误跟踪器上提交了一份报告。尽管如此,我仍然对代码的实际正确性感到好奇。

是编译器处理不当的未定义行为,还是代码本身没有任何问题,仅与编译器有关。我个人在显式模板实例化规范的标准中没有发现任何表明上述代码错误的内容。

我不认为上述内容格式错误,我错过了什么吗?

c++ templates language-lawyer clang++

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

如何从 16 x 8 位 __m128i 值中提取 32 x 4 位整数

假设我有这行代码,它使用 SSE2 加载 16 x 8 位无符号整数

// ptr is a pointer to uint8_t array
__m128i b = _mm_load_si128((const __m128i*) ptr);
Run Code Online (Sandbox Code Playgroud)

我想将每个 8 位无符号整数b(总共 16 个)分成4 位高和 4 位低部分。我怎样才能做到这一点?

x86 sse bit-manipulation simd

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

给定一组间隔S.您必须在最小时间复杂度中找到S中包含在给定间隔(a,b)中的所有间隔

给你一组间隔S.您必须在最小时间复杂度中找到S包含在给定时间间隔内的所有时间间隔(a, b).

这可以O(n)通过蛮力及时完成,其中n是集合中的间隔数S.但如果我被允许做一些预处理,这可以在不到O(n)时间的O(log n)时间内完成吗?

最初我在考虑区间树,但我不认为它适用于此,因为区间树用于获取与给定区间重叠的所有区间.

algorithm tree search intervals data-structures

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

C++编译器是否消除了赋值重复?

如果我有一个示例函数,如:

void func1(float a, float b, float c)
{
    setA(a);
    setB(b);
    setC(c);                                        
}
Run Code Online (Sandbox Code Playgroud)

哪个调用内联函数:

inline void setA(float a){ m_a = a; m_isValid = false; }
inline void setB(float b){ m_b = b; m_isValid = false; }
inline void setC(float c){ m_c = c; m_isValid = false; }
Run Code Online (Sandbox Code Playgroud)

我应该关心"m_isValid = false"重复还是编译器通过优化来消除它们?

c++ compiler-construction optimization compiler-optimization

5
推荐指数
2
解决办法
347
查看次数