问题标签 [multicore]

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 投票
6 回答
80906 浏览

windows - shell进程的并行执行

是否有可用于在 Windows 批处理文件中并行执行多个进程的工具?我找到了一些有趣的 Linux 工具(并行PPSS),但是,我需要一个适用于 Windows 平台的工具。

奖励:如果该工具还允许以简单的方式在多台机器之间分配进程,并以PsExec远程运行进程,那就太好了。

示例:我希望在下面的 for 循环中

有限数量的 processFile.exe 实例并行运行以利用多核 CPU。

0 投票
3 回答
34185 浏览

multicore - 多CPU、多核和超线程有什么区别?

谁能向我解释多 CPU、多核和超线程之间的区别?我总是对这些差异以及每种架构在不同场景中的优缺点感到困惑。

以下是我在网上学习和借鉴别人的评论后目前的理解。

  1. 我认为超线程是其中最劣质的技术,但价格便宜。它的主要思想是重复寄存器以节省上下文切换时间;
  2. 多处理器比超线程好,但是由于不同的CPU在不同的芯片上,不同CPU之间的通信比多核延迟更长,使用多芯片比多核成本和功耗更高;
  3. 多核将所有 CPU 集成在一个芯片上,因此与多处理器相比,不同 CPU 之间的通信延迟大大降低。由于它使用单个芯片来包含所有 CPU,因此与多处理器系统相比,它消耗的功率更少且成本更低。

它是否正确?

0 投票
8 回答
1920 浏览

c++ - 多线程我的程序的负加速

在配备 Intel Pentium 双核处理器 T2370 (Acer Extensa) 的笔记本电脑上,我运行了一个简单的多线程加速测试。我正在使用 Linux。代码粘贴在下面。虽然我期待 2-3 倍的加速,但我惊讶地发现减速了 2 倍。我尝试了 gcc 优化级别 -O0 ... -O3,但每次我得到相同的结果。我正在使用 pthreads。我也尝试过只使用两个线程(而不是代码中的 3 个线程),但性能相似。

可能是什么原因?更快的版本花费了相当长的时间——大约 20 秒——所以这似乎不是启动开销的问题。

注意:这段代码有很多错误(实际上它没有多大意义,因为串行和并行版本的输出会不同)。目的只是为了“获得”相同数量指令的加速比较。


另请参阅:使用更多线程时,什么会使程序运行速度变慢?

0 投票
3 回答
12128 浏览

python - 什么是 LLVM 以及如何用 LLVM 替换 Python VM 将速度提高 5 倍?

Google 正在赞助一个开源项目,以将 Python 的速度提高 5 倍。

Unladen-Swallow似乎有一个很好的项目计划

为什么并发是一个如此困难的问题?
LLVM 会解决并发问题吗?
除了多核之外,还有其他解决方案可用于硬件进步吗?

0 投票
7 回答
1121 浏览

c# - 多处理器和性能

我在.Net 服务中遇到了一个非常奇怪的问题。

我开发了一个多线程 x64 windows 服务。

我在具有 8 个内核的 x64 服务器上测试了这项服务。表演很棒!

现在我将服务移至生产服务器(x64 - 32 核)。在测试过程中,我发现性能至少是测试服务器的 10 倍。

我已经检查了大量的性能计数器,试图找到导致这种糟糕性能的一些原因,但我找不到一点。

可能是GC问题?你有没有遇到过这样的问题?

先感谢您!亚历山大

0 投票
6 回答
808 浏览

c# - 有什么方法可以在 C# 中使这个工作双核?

我有一段代码循环遍历数组并在其中查找相似和相同的字符串 - 标记它是否唯一。

我想让这个双核多线程。据我所知,这是不可能的,但您很可能会有一些想法。

0 投票
9 回答
8974 浏览

python - 多处理还是多线程?

我正在制作一个程序,用于在 Python 中运行模拟,带有 wxPython 接口。在程序中,您可以创建一个模拟,程序会为您渲染(=计算)它。渲染有时会非常耗时。

当用户开始模拟并定义初始状态时,我希望程序在后台连续渲染模拟,而用户可能在程序中做不同的事情。有点像一个充满了 YouTube 风格的栏:您只能播放模拟到渲染的点。

我应该使用多个进程或多个线程还是什么?人们告诉我要使用这个multiprocessing包,我检查了一下,它看起来不错,但我也听说进程与线程不同,不能共享很多信息(我认为我的程序需要共享很多信息。 ) 此外,我还听说过 Stackless Python:它是一个单独的选项吗?我不知道。

请指教。

0 投票
2 回答
1069 浏览

python - 后续:Python 仿真软件的多处理或多线程

这是对此的跟进。(您不必阅读所有答案,只需阅读问题)

人们向我解释了进程和线程之间的区别。一方面,我想要进程,这样我就可以充分利用 CPU 的所有内核,另一方面,进程之间的信息传递不太理想,我不想拥有我正在处理的巨大对象的两个副本和。

所以我一直在想一种方法来做到这一点,结合进程和线程;告诉我这是否有意义。我的程序中的主要进程是 GUI 进程。我会让它产生一个“渲染管理器”线程。渲染管理器线程将负责渲染模拟,但是,它不会自己渲染它们,而是派生其他进程来为它完成工作。

这些是目标:

  1. 渲染应该利用所有可用的核心。
  2. GUI 永远不应该变得迟缓。

我希望渲染管理器成为线程的原因是它必须与 GUI 共享大量信息:即模拟时间线。

那么你认为这是一个好的设计吗?你有什么改进的建议吗?

更新:

对不起,我对“渲染”这个词的使用令人困惑。渲染是指计算模拟,而不是在屏幕上渲染。

0 投票
4 回答
10770 浏览

c - sched_setaffinity() 是如何工作的?

我试图了解 linux 系统调用 sched_setaffinity() 的工作原理。这是我的问题here的后续内容。

我有这个指南,它解释了如何使用系统调用并且有一个非常简洁(工作!)的例子。

所以我下载了 Linux 2.6.27.19内核源代码

我对包含该系统调用的行进行了“grep”,得到了 91 个结果。没有希望。

最终,我试图了解内核如何为特定内核(或处理器)设置指令指针。

我熟悉单核单线程程序的工作原理。有人可能会发出“jmp foo”指令,这基本上将 IP 设置为“foo”标签的内存地址。但是当一个有多个内核时,必须说“在内存地址 foo 处获取下一条指令,并将指令指针设置为2 号内核开始执行”。

在汇编代码中,我们在哪里指定执行该操作的内核?

回到内核代码:这里重要的是什么?文件 'kernel/sched.c' 有一个名为 sched_setaffinity() 的函数,但返回类型“long” - 这与它的手册页不一致。那么这里重要的是什么?这些模块中的哪些显示了发出的汇编指令?什么模块正在读取“task_struct”,查看“cpus_allowed”成员,然后将其转换为指令?(我还翻阅了 glibc 源代码——但我认为它只是调用内核代码来完成这项任务。)

0 投票
5 回答
3155 浏览

java - JVM 在并行处理方面有多好?我什么时候应该创建自己的线程和可运行对象?为什么线程会干扰?

我有一个运行许多小型模拟的 Java 程序。它运行一个遗传算法,其中每个适应度函数都是使用每个染色体上的参数进行的模拟。每个单独运行可能需要 10 秒左右,我想运行一个相当大的人口规模(比如 100?)。在上一轮模拟完成之前,我无法开始下一轮模拟。我可以访问一台装有大量处理器的机器,我想知道我是否需要做任何事情来使模拟并行运行。我以前从未为多核处理器明确写过任何东西,我知道这是一项艰巨的任务。

所以这就是我想知道的:JVM 并行化的程度和效果如何?我读过它创建了低级线程,但它有多聪明?它的效率如何?如果我将每个模拟都设为线程,我的程序会运行得更快吗?我知道这是一个很大的话题,但你能指出一些关于并行处理和 Java 的介绍性文献吗?

非常感谢!

更新: 好的,我已经实现了一个 ExecutorService 并使我的小型模拟实现 Runnable 并具有 run() 方法。而不是这样写:

我在构造函数中写了这个:

然后每次我想向池中添加一个新的模拟时,我运行这个:

RunnableSimulator::run()方法调用该Simulator::play()方法,两者都没有参数。

我想我遇到了线程干扰,因为现在模拟错误了。通过错误输出,我的意思是变量包含它们真正不应该的值。没有更改模拟中的代码,并且在模拟完美运行许多不同的参数之前。模拟游戏的工作原理是这样的:每回合都有一个游戏块,并循环遍历游戏板上的所有位置。它检查给定的位置是否有效,如果有效,则提交该部分,并衡量该板的好坏。现在,显然无效的位置被传递给 commit 方法,导致索引超出范围的错误到处都是。

每个模拟都是它自己的对象,对吧?根据上面的代码?我可以将完全相同的一组参数传递给RunnableSimulatorSimulator类,并且可运行版本会抛出异常。您认为可能导致这种情况的原因是什么,我能做些什么来防止这种情况发生?我可以在新问题中提供一些代码示例以提供帮助吗?