我试图追踪内存损坏错误,我设法得到了大部分的方式.事实证明,ManagedCuda的CudaDeviceVariable
类为每个bool
元素分配4个字节,而我强烈怀疑F#的本机数组每个bool
元素只占用1个字节.该CopyToHost
函数假定源和目标的大小相同,导致它写入数组的末尾.
我希望编译器告诉我F#bool []
实际上是每个元素1个字节,所以我有最终的证明,并用它来替换错误的ManagedCuda
库函数来计算大小.
怎么可能这样呢?
您可以通过bool
在运行时比较相邻数组元素的事实地址来获得数组元素分配大小的防弹指示:
open System.Runtime.InteropServices
let boolarray = Array.zeroCreate<bool> 2
let elemSize = Marshal.UnsafeAddrOfPinnedArrayElement(boolarray,1) -
Marshal.UnsafeAddrOfPinnedArrayElement(boolarray,0)
Run Code Online (Sandbox Code Playgroud)
在fsi中评估为
Run Code Online (Sandbox Code Playgroud)val a : bool [] = [|false; false|] val elemSize : nativeint = 1n
这有效地表明在我的系统上没有填充的情况下每个元素分配1个字节.