C++ - 将所有分配的双精度数组对齐到 32 字节
C++ - align all allocated double arrays to 32bytes
我有一个相当大的代码,我想通过 AVX 指令优化一些操作。根据我的测试,改进应该高达 4 倍。
但是,代码使用带有新运算符的普通旧数组(没有 std::vector)。
double * tmp = new double[size];
问题是,对于 AVX,我需要将所有双精度数组对齐到 32 字节边界。解决方案是将所有 new
替换为 aligned_alloc
(或 MSVC 中的 _aligned_malloc
),并将发布功能替换为足够的功能。这个问题是我必须遍历所有代码并找到所有代码 new
,希望不要忘记一个并且将来每个人都不能忘记使用对齐分配器。
还有其他办法吗?我想过重载 new
运算符只用于 double
但我不确定这是否是正确的方法,如果是这样,如何正确/安全地执行此操作。
我无法使用自己的对齐分配器切换到 std::vector
,因为一些外部 C-only 库将数组作为输入参数。
还有其他办法吗?是的,_mm_loadu_*
和 _mm_storeu_*
,其中 u
代表未对齐。
我有一个相当大的代码,我想通过 AVX 指令优化一些操作。根据我的测试,改进应该高达 4 倍。
但是,代码使用带有新运算符的普通旧数组(没有 std::vector)。
double * tmp = new double[size];
问题是,对于 AVX,我需要将所有双精度数组对齐到 32 字节边界。解决方案是将所有 new
替换为 aligned_alloc
(或 MSVC 中的 _aligned_malloc
),并将发布功能替换为足够的功能。这个问题是我必须遍历所有代码并找到所有代码 new
,希望不要忘记一个并且将来每个人都不能忘记使用对齐分配器。
还有其他办法吗?我想过重载 new
运算符只用于 double
但我不确定这是否是正确的方法,如果是这样,如何正确/安全地执行此操作。
我无法使用自己的对齐分配器切换到 std::vector
,因为一些外部 C-only 库将数组作为输入参数。
还有其他办法吗?是的,_mm_loadu_*
和 _mm_storeu_*
,其中 u
代表未对齐。