问题标签 [barrier]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1372 浏览

c - MPI C 中的一般运行时间测量

目标是测量运行时间与#of 进程。

我只是 MPI 的初学者并且被困在某个地方。

我写了一个 hello world 程序并想测试全局运行时。

我尝试使用屏障,以确保所有进程在测量系统时间之前终止,但我遇到了分段错误。

我的代码:

帮我弄清楚为什么会出现分段错误?

0 投票
1 回答
202 浏览

c - C: 等效于 windows 的 pthread_barrier_t

根据标题,pthread_barrier_twindows中是否有等效的类型?我找到了SYNCHRONIZATION_BARRIER,但似乎仅从 Windows 8 开始可用。

有没有更便携的?

谢谢

0 投票
1 回答
1091 浏览

c++ - 使用 Atomic Builtins 旋转线程屏障

我正在尝试使用原子实现旋转线程屏障,特别是 __sync_fetch_and_add。https://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/Atomic-Builtins.html

我基本上想要一个替代 pthread 屏障的方法。我在一个可以并行运行大约一百个线程的系统上使用 Ubuntu。

由于明显的原因,这不起作用(一个线程可能设置 bar=0,而另一个线程陷入无限的 while 循环等)。我在这里看到了一个实现:Writing a (spinning) thread barrier using c++11 atomics,但它似乎太复杂了,我认为它的性能可能比 pthread 屏障差。

由于 bar 的缓存线在线程之间进行乒乓操作,因此该实现还有望在内存层次结构中产生更多流量。

关于如何使用这些原子指令制作简单屏障的任何想法?此外,通信优化方案也会有所帮助。

0 投票
2 回答
422 浏览

c - CPU乱序效果测试程序

我写了一个多线程程序来演示英特尔处理器的乱序效果。该程序附在本文末尾。预期的结果应该是当 x 被 handler1 打印为 42 或 0 时。但是,实际结果始终为 42,这意味着不会发生乱序效应。

我使用命令“gcc -pthread -O0 out-of-order-test.c”编译了程序我在英特尔 IvyBridge 处理器英特尔(R ) Xeon(R) CPU E5-1650 v2。

有谁知道我应该怎么做才能看到乱序效应?

0 投票
2 回答
914 浏览

c - 为什么“barrier()”足以禁用或启用抢占?

从 Linux 内核代码中,我可以看到preempt_enable()andpreempt_disable()只是barrier()

我无法理解。为什么只 abarrier()就足以禁用或启用抢占?

0 投票
2 回答
527 浏览

elixir - Elixir中的同步障碍?

Elixir 的(循环)屏障最优雅的实现可能是什么?要实现的算法(顶点着色)有一个循环,其中有一个等待阶段的衍生进程(“并行同步执行”,然后使用所有进程的结果检查终止条件),它是算法 5“6 色“来自分布式计算原理,Ch。1.

大多数参考是针对 .NET、pthread 和其他与线程相关的计算,所以我不确定屏障是否是我所追求的正确模式。可能,还有更多“灵药”的方式。

我还没有任何代码(搜索模式),但这里是代码,实现相同问题的“慢”版本:https ://codereview.stackexchange.com/questions/111487/coloring-trees-in-灵丹妙药

我得到的想法是让顶级进程(每个图节点产生一个进程)来发送和接收消息,这将同步节点进程。必须提到的是,节点进程也相互通信:父进程在一次顶级循环迭代期间向子进程发送消息。然而,复杂的是,在顶级接收节点的消息之后和所有节点进行迭代之前,任何进程都不应该继续(尽管我很可能会使用尾递归)。这就是我想到屏障机制的原因。

0 投票
1 回答
103 浏览

objective-c - 将调度障碍 (GCD) 添加到自定义队列但不添加到全局并发队列

我在某处读到应该将调度障碍添加到自定义队列而不是全局队列。我没有得到确切的原因。谢谢。

0 投票
0 回答
110 浏览

memory - 为什么必须使用通用屏障来保证 cpu 的传递性?

我最近阅读了内存屏障中cpu的传递性,作者强调只有一般屏障才能保证传递性。但是,我不能很好地理解它。例如:

假设X在CPU3的缓存中,状态被修改;Y在CPU2的缓存中,状态也被修改。

如果我们在读屏障之前添加写屏障,CPU1 与 CPU2 共享它的存储缓冲区。(它成为一个普遍的障碍)

1) CPU1 在存储缓冲区中设置 X(X=1) 的值。

2) CPU2 从存储缓冲区(共享存储缓冲区)中读取 X 的值。

3)CPU2在存储缓冲区(写屏障)中标记X,并读取无效队列以确保没有来自CPU3的无效消息(读屏障)。

4) CPU2 想要将 X 的缓存行从无效更改为已修改,因此向 CPU3 发送无效消息。

5) CPU3接收到X的无效消息,将其放入无效队列并响应CPU2。

6) CPU2收到response后,将X = 1写入内存或缓存,并加载Y == 0。

...

7) CPU3在执行通用屏障时会发现它的无效队列中有X的无效消息,之后X必须等于1。

没关系,我可以理解。但是,我从perbook的图14.3中阅读了另一个示例,如下所示:

有一些机会触发断言。作者说将所有障碍更改为 smp_mb 可以在 Quick Quiz 14.2 的回答中修复它。

所以,我的问题是为什么我们需要将 thread1 中的屏障更改为 smp_mb?如果 thread0 和 thread1 在 CPU0 和 CPU1 上运行,并且它们共享一个存储缓冲区。在线程 1 执行 Store C = 1 后,它们的存储缓冲区会爆炸。

[A(wb), B, C]

因为thread2(在CPU2上运行)也使用smp_mb而不是barrier,所以它保证如果看到C == 1,A一定是1。

我在 MESI 内存一致性协议中描述了以上所有内容。也许作者的意思是有另一个协议使 thread1 中的屏障必须代替 smp_mb 来保证 cpu 的传递性?

谁能给我一个例子吗?

也许在特定协议中考虑传递性是一个错误。我们必须记住的是,rmb() 或 wmb() 并不能保证 cpu 的传递性,因为有很多不同的协议和架构。

0 投票
0 回答
79 浏览

java - 看不懂屏障代码

我遇到了这个障碍代码,我无法理解该barrierPost方法。

我应该使用此代码来解决一个练习,其中两个线程团队相互竞争以计数到 10000。

我不明白为什么相同的条件会产生相反的结果

有人可以帮忙吗?

0 投票
2 回答
135 浏览

opencl - 这种并行性可以在 OpenCL 中实现吗

这是我的第一篇文章。我会尽量保持简短,因为我珍惜你的时间。这个社区对我来说太不可思议了。

我正在学习 OpenCL,想从下面的算法中提取一点并行性。我只会向您展示我正在处理的部分,我也尽可能地简化了它。

1) 输入:两个长度为 (n) 的一维数组:A、B 和 n 的值。还有值 C[0]、D[0]。

2) 输出:两个长度为 (n) 的一维数组:C、D。

所以这些是递归定义,但是对于给定的 i 值的 C & D 的计算可以并行完成(它们显然更复杂,以便有意义)。一个天真的想法是为以下内核创建两个工作项:

理想情况下,两个工作项(数字 0,1)中的每一个都将进行一次初始比较,然后进入它们各自的循环,为每次迭代同步。现在考虑到 GPU 的 SIMD 实现,我假设这将不起作用(工作项将等待所有内核代码),但是是否可以将这种类型的工作分配给两个 CPU 内核并使其按预期工作?在这种情况下,障碍是什么?