首页 > 解决方案 > 更新到 Catalina 后的 Simd 错误 - Swift

问题描述

以前工作的代码现在出现错误:

var row1 = simd_double3(x:CV1.x, y: CV1.y, z:CV1.z)
var row2 = simd_double3(x:CV2.x, y: CV2.y, z:CV2.z)
var row3 = simd_double3(x:self.n.x, y: self.n.y, z:self.n.z)
var m:simd_double3x3 = simd_double3x3(rows: [row1, row2, row3])
self.majorInvMatrix = m.inverse

m.inverse 的分配得到

EXC_BAD_ACCESS(代码=EXC_1386GPFLT)

将其更改为

let zz = m.inverse

仍然给出错误,但如果我在分配之前中断代码并m.inverse在控制台中查看没有问题。

如果我在行var a = 2中添加没有问题(它不适用于let a = 2

var row1 = simd_double3(x:CV1.x, y: CV1.y, z:CV1.z)
var row2 = simd_double3(x:CV2.x, y: CV2.y, z:CV2.z)
var row3 = simd_double3(x:self.n.x, y: self.n.y, z:self.n.z)
var m:simd_double3x3 = simd_double3x3(rows: [row1, row2, row3])
var a = 2
self.majorInvMatrix = m.inverse

标签: swiftsimd-library

解决方案


这是一个操作系统错误,或者更确切地说是一个操作系统库错误。简单来说,编译器和 SIMD 库对于如何simd_double3x3在内存中对齐存在分歧。

var a = 2更改了堆栈上事物的对齐方式,这就是它起作用的原因(在您的情况下-不幸的是,不是我的)。

该问题将在 10.15.4 中修复。

此线程的完整详细信息:

https://forums.developer.apple.com/thread/127976


推荐阅读