c# - 在 Parallel.For 循环内使用 Span

标签 c# parallel-processing parallel.for

我正在使用 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/

相关文章:

c# - LINQ 风格的 IS IN 查询

c - 使用带有 MPI 的 master-worker 时,哪个大小的 block 将产生最佳性能?

python - 进度条使用 tqdm 和多进程将代码减慢 5 倍

c# - 如何在 TPL 中使用 Parallel For 而不是 While

c# - 嵌套 Parallel.For 循环 C# 中的资源共享

c++ - tbb::parallel_for 是否总是利用调用线程

C# : Data collection to keep string?

c# - 如何使 UI 在 Winforms 中响应

linux:提交给 sge 的作业卡在 'dt' 状态

c# - 如何将字典绑定(bind)到 MSChart