SIMD和动态内存分配

Pio*_*him 4 c++ memory-management sse simd

可能重复:
SSE,内在函数和对齐

我是SIMD编程的新手,所以如果我问一个明显的问题,请原谅.

我正在进行一些实验,并且想要在动态分配的结构中存储SIMD值.

这是代码:

struct SimdTest
{
    __m128      m_simdVal;

    void setZero()
    {
        __m128 tmp = _mm_setzero_ps(); 
        m_simdVal = tmp; // <<--- CRASH ---
    }
};

TEST( Plane, dynamicallyAllocatedPlane )
{
    SimdTest* test = new SimdTest();

    test->setZero();

    delete test;
}
Run Code Online (Sandbox Code Playgroud)

当执行标记为CRASH注释的方法时,代码崩溃并出现以下异常:

Unhandled exception at 0x775315de in test-core.exe: 0xC0000005: Access violation reading location 0x00000000
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么赋值操作会中断,以及如何动态分配包含SIMD的对象以使它们正常工作?

我需要补充一点,如果我静态实例化一个SimdTest对象并调用setZero方法,一切正常.

谢谢,Paksas

Han*_*ant 5

它死了,因为结构不对齐.CRT分配器只允许对齐到8,这里需要16.您需要在MSVC上使用_aligned_malloc()来获得正确对齐的堆分配内存.

两种方法.由于这是一个POD结构,你可以直接投射:

#include <malloc.h>
...
    SimdTest* test = (SimdTest*)_aligned_malloc(sizeof SimdTest, 16);
    test->setZero();
    _aligned_free(test);
Run Code Online (Sandbox Code Playgroud)

或者您可以覆盖结构的new/delete运算符:

struct SimdTest
{
    void* operator new(size_t size) { return _aligned_malloc(size, 16); }
    void operator delete(void* mem) { return _aligned_free(mem); }
    // etc..
};
Run Code Online (Sandbox Code Playgroud)