【问题标题】:Why does using `cblas_ccopy` cause intermittent memory errors?为什么使用 `cblas_ccopy` 会导致间歇性内存错误?
【发布时间】:2018-05-21 03:32:09
【问题描述】:

下面的代码只是尝试使用cblas_ccopy 将值从一个指针复制到另一个指针,但大约三分之一的时间会导致malloc: *** error ... incorrect checksum for freed object 错误。为什么它总是不工作?

import Accelerate

func testCopy() {

    // set capacity
    let capacity: Int = 1000

    // destination array
    let destinationArray = UnsafeMutablePointer<Float>.allocate(capacity: capacity)
    destinationArray.initialize(repeating: 0, count: capacity)

    // source array
    let sourceArray = UnsafeMutablePointer<Float>.allocate(capacity: capacity)
    sourceArray.initialize(repeating: 1, count: capacity)

    // copy values
    cblas_ccopy(Int32(capacity),
                UnsafeRawPointer(sourceArray),
                1,
                UnsafeMutableRawPointer(destinationArray),
                1)

    // check to see if values were copied
    for idx in 0..<capacity {
        print(idx, destinationArray[idx])
    }
}

testCopy()

将其作为单元测试运行时,错误为objc[44736]: autorelease pool page 0x7fecb903c000 corrupted。作为脚本运行时,错误为incorrect checksum

我尝试在malloc_error_break 中设置断点,但我不明白如何解释输出。

我还尝试将sourceArraydestinationArray 作为参数传递给cblas_ccopy,而不将它们转换为原始指针,但这并没有帮助。

【问题讨论】:

    标签: swift accelerate-framework unsafe-pointers cblas


    【解决方案1】:

    使用cblas_scopy 代替cblas_ccopycblas_ccopy 复制(单精度)复数个数,其大小是您实际使用的单精度数的两倍,因此您超出了缓冲区的末尾。

    【讨论】:

      【解决方案2】:

      _ccopy 中的c-前缀表示元素类型是单精度复数。所以,在你的cblas_ccopy(Int32(capacity),...)中,两个指针都需要包含capacity单精度复数元素,也就是2 * capacity单精度浮点数元素。

      您只需分配单精度浮点数的capacity 元素。您可能知道当内存访问超过内存限制时会发生什么。

      尝试将分配大小加倍:

      let destinationArray = UnsafeMutablePointer<Float>.allocate(capacity: 2 * capacity)
      destinationArray.initialize(repeating: 0, count: 2 * capacity)
      
      // source array
      let sourceArray = UnsafeMutablePointer<Float>.allocate(capacity: 2 * capacity)
      sourceArray.initialize(repeating: 1, count: 2 * capacity)
      
      // copy values
      cblas_ccopy(Int32(capacity), //<- do not double here.
                  UnsafeRawPointer(sourceArray),
                  1,
                  UnsafeMutableRawPointer(destinationArray),
                  1)
      

      (或者尝试分配单精度复数数字的capacity元素,而不是Float。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-08
        • 2022-01-15
        • 2016-12-09
        • 2022-11-15
        • 2014-04-17
        • 2014-11-07
        • 2013-05-15
        • 2020-03-14
        相关资源
        最近更新 更多