我正在使用 Span 将 float 组转换为字节数组。使用普通的 for 循环没有问题,但是对于我拥有的数字量,我需要并行化我的代码,所以我最终使用了 Parallel.For。问题是我无法在这个循环中使用 Span。 这是我的代码:
Span<float> floats = MemoryMarshal.Cast<byte, float>(posColBuffer);
Parallel.For(0, posColBuffer.Length/4, i=>
{
var scalar = calcScalar(i);
float color = calcColor(i);
var id0 = 3 * i;
for (int j = 0; j < 3; j++)
{
floats[i+j] = directions[id0 + j] * scalar;
floats[colorOffset + i+j] = color;
}
});
IDE 告诉我的错误是“无法在 lambda 表达式内使用类似 byref 类型“Span”的局部变量“floats””
我尝试将 Span 的构造放入 Parallel.For 中,但这不起作用。它没有显示错误,但它从未退出并行 for 循环。
可以这样做吗?
最佳答案
Span
是仅堆栈的数据结构,根据设计,它保证保留在堆栈上并且不能离开堆栈。您可以在 For
内移动强制转换:
Parallel.For(0, posColBuffer.Length/4, i=>
{
Span<float> floats = MemoryMarshal.Cast<byte, float>(posColBuffer);
// ...
});
请注意,floats[i + j]
也存在索引错误,因为它会溢出,如 @Matthew Watson 中提到的那样。在评论中。
关于c# - 在 Parallel.For 循环内使用 Span,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77611707/