gpt4 book ai didi

c++ - 堆栈上的 G++ SSE 内存对齐

转载 作者:可可西里 更新时间:2023-11-01 15:13:04 28 4
gpt4 key购买 nike

我正在尝试使用 Streaming SIMD Extensions 重写 raytracer。我最初的 raytracer 使用内联汇编和 movups 指令将数据加载到 xmm 寄存器中。我读过编译器内在函数并不比内联汇编慢很多(我怀疑我什至可以通过避免未对齐的内存访问来提高速度),而且更便携,所以我试图迁移我的 SSE 代码以使用 xmmintrin.h 中的内在函数.受影响的主要类是 vector,它看起来像这样:

#include "xmmintrin.h"
union vector {
__m128 simd;
float raw[4];
//some constructors
//a bunch of functions and operators
} __attribute__ ((aligned (16)));

我之前读到 g++ 编译器会自动沿着内存边界分配结构,内存边界等于最大成员变量的大小,但这似乎并没有发生,对齐属性也没有帮助。我的研究表明这可能是因为我在堆栈上分配了一大堆函数局部 vector ,并且在 x86 中不能保证堆栈对齐。有没有办法强制这种对齐?我应该提一下,这是在 32 位机器上的 native x86 Linux 下运行的,而不是 Cygwin。我打算在这个应用程序中进一步实现多线程,因此将有问题的 vector 实例声明为静态不是一种选择。如果需要,我愿意增加 vector 数据结构的大小。

最佳答案

最简单的方法是std::aligned_storage,它将对齐作为第二个参数。

如果您还没有,您可能需要查看 Boost's version .

然后你可以建立你的联盟:

union vector {
__m128 simd;
std::aligned_storage<16, 16> alignment_only;
}

最后,如果它不起作用,您可以随时创建自己的小类:

template <typename Type, intptr_t Align> // Align must be a power of 2
class RawStorage
{
public:
Type* operator->() {
return reinterpret_cast<Type const*>(aligned());
}

Type const* operator->() const {
return reinterpret_cast<Type const*>(aligned());
}

Type& operator*() { return *(operator->()); }
Type const& operator*() const { return *(operator->()); }

private:
unsigned char* aligned() {
if (data & ~(Align-1) == data) { return data; }
return (data + Align) & ~(Align-1);
}

unsigned char data[sizeof(Type) + Align - 1];
};

它会分配比必要更多的存储空间,但这种方式可以保证对齐。

int main(int argc, char* argv[])
{
RawStorage<__m128, 16> simd;
*simd = /* ... */;

return 0;
}

幸运的是,如果编译器检测到对齐是必要的,它可能能够优化掉指针对齐的东西。

关于c++ - 堆栈上的 G++ SSE 内存对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4965784/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com