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
它死了,因为结构不对齐.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)
| 归档时间: |
|
| 查看次数: |
1582 次 |
| 最近记录: |