【发布时间】:2012-09-24 15:26:47
【问题描述】:
我是 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 方法,一切正常。
谢谢, 帕克萨斯
【问题讨论】:
-
看起来你是最新的错位受害者。
new没有充分对齐 16 个字节。 -
在外面的某个地方一定有一个很好的副本。
-
是的——肯定是这样。当我将自定义分配器添加到将分配的内存地址与 16 字节边界对齐的类时,一切都开始正常工作了。
-
尝试:__declspec(align(16)) SimdTest * test = ...
-
@stark 不,那宁愿对齐指针变量本身,这不是必需的,它是分配的内存,其地址分配给需要对齐的指针。
标签: c++ memory-management sse simd