随着英特尔为台式机推出Hexa-Core(6)处理器,看起来我们已经不能再等待微软让多核编程"轻松"了.我刚刚订购了Joe Duffy的书"Concurrent Programming on Windows".这看起来是一个很好的起点,但是,我希望你们中有些人一直瞄准多个/多个核心系统会给我一些好的资源,这些资源已经或者对你的项目有所帮助?
你已经给出了一些很好的答案,但是,让我加上"好资源"的意思.仅仅因为我们有6,12或48个核心并不意味着我们的应用程序将从尝试使用它们中受益.我一直听说当我们的系统中有大量内核时,当前的编程范式将会发生变化.
我应该阅读哪些博客/书籍以最好地理解模式以及何时使用它们.是否有任何好的播客或网络广播可以提供帮助.
以下是我发现的一些有趣的链接:
一般有用:
多线程:
如何在同一网络上通过SSH连接的双核机器上运行并行测试?
https://github.com/grosser/parallel_tests对本地工作人员运行良好,但无法在多台机器上运行它
https://github.com/qxjit/deep-test - 运行它时我没有运气,示例中有一条线就像
t.distributed_hosts
Run Code Online (Sandbox Code Playgroud)
这会引发错误
随着Hydra我有一个问题永远等待ssh工人
我尝试了自己的alpha版本,创建了一个测试回购并运行它,但没有运气
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent …Run Code Online (Sandbox Code Playgroud) 假设我们有以下代码定义了一个连续循环(就像游戏一样):
let queue = DispatchQueue(label: "DemoSerialQueue")
let workItem = DispatchWorkItem{ print("Hello World") }
func gameLoop() {
queue.async(execute:workItem)
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在速度方面是否比以下代码更有效:
func gameLoop() {
queue.async{ print("Hello World") }
}
Run Code Online (Sandbox Code Playgroud)
我特别想知道第二种形式是否会在每个循环上分配一个闭包,从而导致性能下降。
我正在尝试运行 a Parallel.ForEachAsync(),但出现以下两个错误:
错误 1:
参数 2:无法从 System.Threading.Tasks.ParallelOptions 转换为 System.Threading.CancellationToken
错误 2:
Delegate Func<WC, CancellationToken, ValueTask> 不采用 1 个参数
这是我的代码:
public async Task<List<DisplayDto>> GetData()
{
var options = new ParallelOptions()
{
MaxDegreeOfParallelism = 20;
};
await Parallel.ForEachAsync(result, options, async OrderNumber => {
//Do Stuff here.
});
}
Run Code Online (Sandbox Code Playgroud)
为了使其按照我的要求工作,必须改变什么?
我正在运行一个多线程循环:
protected ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = 2;
Parallel.ForEach(items, parallelOptions, item =>
{
// Loop code here
});
Run Code Online (Sandbox Code Playgroud)
我想在执行并行循环期间更改parallelOptions.MaxDegreeOfParallelism以减少或增加多个线程.
parallelOptions.MaxDegreeOfParallelism = 5;
Run Code Online (Sandbox Code Playgroud)
它似乎没有增加线程.有没有人有任何想法?
所以我有这个严格的递归函数,我想用我的代码.问题是它没有真正利用双核机器,因为js是单线程的.我曾尝试过使用webworkers,但对多核编程并不是很了解.有人会指出一些可以解释它是如何完成的材料.我google搜索这个示例链接,但没有文档它没有多大帮助!= /
如果有人能告诉我如何在没有网络工作者的情况下做到这一点,我会很高兴!那真是棒极了!=)
我在whatwg上遇到了这个链接.这真的很奇怪,因为它解释了如何在webworkers等中使用多核编程,但是在我的chrome浏览器上执行它会引发错误.其他浏览器也是如此.
错误:9未捕获的ReferenceError:未在worker.js中定义Worker
据我所知,新的TPL(任务并行库)已经实现了Parallel.ForEach(),因此它可以使用"表达的并行性".这意味着,它并不保证您的代理将在多个线程中运行,而是检查主机平台是否具有多个内核,如果为true,则仅在整个内核中分配工作(每个内核主要为1个线程) .
如果主机系统没有多个核心(越来越难以找到这样的计算机),那么它将像"常规"的foreach循环一样顺序运行你的代码.非常酷的东西,坦率地说.
通常我会做类似下面的事情来将我的长时间运行操作放在ThreadPool的后台线程上:
ThreadPool.QueueUserWorkItem(new WaitCallback(targetMethod),new Object2PassIn());
在主机只有单核的情况下,TPL的Parallel.ForEach()会自动将调用放在后台线程上吗?或者,我是否应该从后台调用任何TPL调用,以便如果我从单个核心计算机执行,那么至少该逻辑将不在GUI的调度线程中?
我担心的是,如果我让TPL负责所有这些,我想确保它确定它是一个单核心盒,它仍然将Parallel.ForEach()循环内部的代码编组到一个后台线程上,就像我一样完成,以免阻止我的GUI.
感谢您的任何想法或建议......
我的代码有点像这样:
($i=0; $i < 100; $i++)
{
do ($foo[$i]);
}
Run Code Online (Sandbox Code Playgroud)
以上是一项耗时的任务,我希望能够创建一个函数,并在下面调用它两次
function wrapper($start;$end)
{
($i=$start; $i < $end; $i++)
{
do ($foo[$i]);
}
}
//have both of these run in parallel
wrapper(0,50);
wrapper(51,100);
Run Code Online (Sandbox Code Playgroud)
我看着Gearman,但我无法使用它,因为我无法安装gearman服务器(因为我在共享服务器上).似乎实现这一目标的方法是通过分叉.我尝试了很多关于它的内容,但文档和支持很少.任何帮助/线框代码将不胜感激.
为了定义我的问题,我如何调用wrapper()传递参数,以便它在子进程中执行.此外,重要的是我能够注册回调函数.
其他详细信息:PHP 5.3,在Linux服务器上运行.脚本由cgi-fcgi执行.
我认为这是我应该如何生成子进程,但是如何使用它来生成多个子进程?我如何注册回调函数?
$pid = pcntl_fork();
if ( $pid == -1 ) {
// Fork failed
exit(1);
} else if ( $pid ) {
// The parent process
//should I repeat this same code here to spawn another child process?
} else { …Run Code Online (Sandbox Code Playgroud) 并且"同样的事情"我的意思是这两个操作基本上做同样的工作,它只是归结为哪个更方便根据你必须使用的工作来调用?(即代表列表或迭代的事项列表)?我一直在搜索MSDN,StackOverflow和各种随机文章,但我还没有找到一个明确的答案.
编辑: 我应该更清楚; 我问这两种方法是否做同样的事情,因为如果他们不这样做,我想了解哪种方法会更有效率.
示例:我有500个键值的列表.目前我使用foreach循环遍历列表(连续)并执行每个项目的工作.如果我想利用多个内核,我应该简单地使用Parallel.ForEach吗?让我们说为了参数的缘故,我为这500个任务组成了一个500个代表的数组 - 是否会产生任何不同的调用Parallel.Invoke,给它一个500个代表的列表?
提前谢谢了!
我正在尝试Delphi XE7 Update 1的并行编程功能.
我创建了一个简单的TParallel.For循环,基本上做了一些虚假的操作来消磨时间.
我在AWS实例(c4.8xlarge)上的36 vCPU上启动了该程序,试图了解并行编程的优势.
当我第一次启动程序并执行TParallel.For循环时,我看到了显着的增益(虽然admitelly比我预期的36个vCPU少很多):
Parallel matches: 23077072 in 242ms
Single Threaded matches: 23077072 in 2314ms
Run Code Online (Sandbox Code Playgroud)
如果我不关闭程序并在不久之后再次在36 vCPU机器上运行传递(例如,立即或大约10-20秒后),并行传递会恶化很多:
Parallel matches: 23077169 in 2322ms
Single Threaded matches: 23077169 in 2316ms
Run Code Online (Sandbox Code Playgroud)
如果我没有关闭程序并等待几分钟(不是几秒钟,但几分钟)再次运行传递之前,我再次得到第一次启动程序时得到的结果(响应时间提高了10倍) .
在36个vCPU机器上启动程序后的第一次传递总是更快,因此看起来这种效果仅TParallel.For在程序中第二次调用a时发生.
这是我正在运行的示例代码:
unit ParallelTests;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
System.Threading, System.SyncObjs, System.Diagnostics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
SingleThreadCheckBox: TCheckBox;
ParallelCheckBox: TCheckBox;
UnitsEdit: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ …Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×3
.net-4.0 ×1
asynchronous ×1
delphi ×1
fork ×1
html5 ×1
javascript ×1
optimization ×1
php ×1
rtl-ppl ×1
swift ×1
testing ×1
unit-testing ×1
web-worker ×1