c++ - SIMD 和动态内存分配

标签 c++ memory-management sse simd

<分区>

Possible Duplicate:
SSE, intrinsics, and alignment

我是 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;
}

执行带有CRASH注释的方法时,代码崩溃,异常如​​下:

Unhandled exception at 0x775315de in test-core.exe: 0xC0000005: Access violation reading location 0x00000000

谁能解释一下为什么分配操作会中断,以及应该如何动态分配包含 SIMD 的对象才能正常工作?

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

谢谢, 帕克萨斯

最佳答案

它因为结构未对齐而死亡。 CRT 分配器只 promise 对齐到 8,这里需要 16。您需要在 MSVC 上使用 _aligned_malloc() 以获得正确对齐的堆分配内存。

两种方法。由于这是一个 POD 结构,您可以直接转换:

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

或者您可以覆盖结构的新建/删除运算符:

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

关于c++ - SIMD 和动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12712941/

相关文章:

x86 - 如何使用 SIMD 检查偶数/奇数 channel 是否在给定范围内?

x86 - 显示向量寄存器的约定

c++ - 堆栈展开是否会释放在堆上分配的内存?

c++ - 我用于渲染随机多边形的代码无法正常工作

c++ - Magick++ 无法读取原始 nef 图像

C++ - 连续内存和多态性

c++ - 如何在OpenCL中使用缓冲区分配和映射内存机制?

c++ - 奇怪的 malloc 行为不允许在 64 位进程上分配超过 2GB 的内存

c++ - 我怎样才能释放 ostringstream?

c++ - 如何向量化 data_i16[0 到 15]?