gpt4 book ai didi

concurrency - D 并发写入缓冲区

转载 作者:行者123 更新时间:2023-12-02 02:20:48 30 4
gpt4 key购买 nike

假设您有一个大小为 N 的缓冲区,必须将其设置为确定的值(比如设置为零或其他值)。缓冲区中的此值设置分为 M 个线程,每个线程处理缓冲区的 N/M 个元素。

缓冲区不能不可变,因为我们改变了值。消息传递也不起作用,因为禁止传递 ref 或数组(= 指针)类型。所以它必须通过 shared 发生吗?不,因为在我的例子中,缓冲区元素是 creal 类型,因此算术不是原子的。

最后,主程序必须等待所有线程完成。假设每个线程只写入数组的一个子集,并且数组中没有线程与另一个线程重叠或以任何方式相互依赖。

我将如何以并发方式写入(或修改)缓冲区?

PS:有时我可以简单地将数组分成 M 个连续的部分,但有时我会逐列检查数组(数组是一维但表示二维数据)。这使得线程使用的各个数组实际上交错在母数组中。啊。


编辑:我发现 shared(creal)[] 类型可以工作,因为现在元素是共享的,而不是数组本身。我敢打赌,您可以并行化交错数组。但是有一些缺点:

shared 存储类非常严格,必须使用关键字进行分配。这使得它很难封装;由于调用者必须提供数组,因此它必须传递一个 shared 数组,不能只是一般地传递​​一个常规数组并让处理函数担心并行性。不,调用函数也必须担心并行性,以便处理函数接收共享数组并且不需要将数组重新分配到 shared 空间。

还有一个非常奇怪的错误,当我在某些位置动态分配 shared(creal)[] 时,它只是在分配时挂起。似乎很随机,找不到罪魁祸首......在测试示例中这有效,但在我的项目中无效... 结果证明这是 DMD/OptLink 中的错误。


EDIT2:我从未提到过,但它用于实现 FFT(快速傅里叶定理)。所以我无权选择精确的缓存对齐切片。我所知道的是元素的类型是 creal,元素的数量是 2 的幂(每行/列)。

最佳答案

您可以使用 std.parallelism模块

T[] buff;
foreach(ref elem;parallel(buff))elem=0;

但是如果你想重新发明它,你可以只使用共享(它是线程安全的,一次只让一个线程访问某个元素,如果你用适当的 join() 强制执行它或者 Task.*force() 更好)

关于concurrency - D 并发写入缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8330701/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com