From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=AWL,DNS_FROM_RFC_ABUSE, SPF_NEUTRAL autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail1-relais-roc.national.inria.fr (mail1-relais-roc.national.inria.fr [192.134.164.82]) by yquem.inria.fr (Postfix) with ESMTP id 722B3BB84 for ; Thu, 17 Jul 2008 14:48:37 +0200 (CEST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhMEANjcfkhDWxLCbmdsb2JhbACBWpBtNp05 X-IronPort-AV: E=Sophos;i="4.31,203,1215381600"; d="scan'208";a="15208693" Received: from ip67-91-18-194.z18-91-67.customer.algx.net (HELO server1.bertec.net) ([67.91.18.194]) by mail1-smtp-roc.national.inria.fr with ESMTP; 17 Jul 2008 14:48:20 +0200 Received: from kuba.bertec.net (kuba.bertec.net [192.168.2.16]) by server1.bertec.net (Postfix) with ESMTP id 45F6C1056D8 for ; Thu, 17 Jul 2008 08:48:19 -0400 (EDT) From: Kuba Ober To: caml-list@yquem.inria.fr Subject: Re: [Caml-list] Re: thousands of CPU cores Date: Thu, 17 Jul 2008 08:48:18 -0400 User-Agent: KMail/1.9.9 References: <200807151157.22397.ober.14@osu.edu> <1216145029.16617.42.camel@flake.lan.gerd-stolpmann.de> In-Reply-To: <1216145029.16617.42.camel@flake.lan.gerd-stolpmann.de> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200807170848.18494.ober.14@osu.edu> X-Spam: no; 0.00; gerd:01 stolpmann:01 donnerstag:01 gerd:01 stolpmann:01 donnerstag:01 ocaml:01 stdin:01 stdout:01 mingw:01 sockets:01 syscalls:01 orthogonal:01 syscalls:01 unices:01 On Tuesday 15 July 2008, you wrote: > Am Dienstag, den 15.07.2008, 11:57 -0400 schrieb Kuba Ober: > > On Thursday 10 July 2008, Gerd Stolpmann wrote: > > > Am Donnerstag, den 10.07.2008, 21:02 +0000 schrieb Sylvain Le Gall: > > > > On 10-07-2008, Gerd Stolpmann wrote: > > > > > Am Donnerstag, den 10.07.2008, 20:07 +0000 schrieb Sylvain Le Gall: > > > > >> On 10-07-2008, Gerd Stolpmann wrote: > > > > >> > In Ocaml you can exploit multi-core currently only by using > > > > >> > multi-processing parallel programs that communicate over message > > > > >> > passing (and only on Unix). Actually, it's an excellent language > > > > >> > for this style. > > > > >> > > > > >> Why only on Unix ? > > > > > > > > > > No fork() on Windows. And emulating its effects is hard. > > > > > > > > open_process + stdin/stdout should do the trick... at least i think > > > > so. > > > > > > After having ported godi to mingw I am not sure whether this works at > > > all. The point is that you usually want to inherit OS resources to the > > > child process (e.g. sockets). The CreateProcess Win32 call > > > (http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx) mentions > > > that you can inherit handles, but I would be careful with the > > > information given in MSDN. Often it works only as far as the presented > > > examples. Windows isn't written for multi-processing, and its syscalls > > > aren't as orthogonal as in Unix-type systems. > > > > Windows syscalls are quite reasonable IMHO, if a tad undocumented. > > ReactOS folk have done a great job of reimplementing most of them, and > > there isn't anything mucho broken about those. In fact, I'd posit that > > Windows native syscalls expose some functionality that's traditionally > > unavailable on unices and requires hacks to achieve (usually via > > executable code injection). Just look at what Wine folks had to do in > > order to emulate some win32 (not even native!) API on Linux: a lot of > > hard work for what amounts to a single API call. This of course works > > both ways, and on Windows, while a fork() implementation is simple, it > > AFAIK requires a custom loader or some other ingenuity to work. > > Sure, both systems follow different philosophies. > > > > Furthermore, it looks like a pain in the ass - often you want to run > > > some initialization code, and without fork() you have to run it as > > > often as you start processes. > > > > On Windows, there's the native API, which is then used by the win32 > > subsystem and posix subsystems to do the job. Native API allows fork() > > implementations mostly on par with what you get on Unices. MS has a posix > > subsystem on which fork() performs in the same ballpark as fork() on > > linux, and make Cygwin's fork() look bad like it deserves. About the only > > good thing about Cygwin's fork() is that it works on win9x. > > Well, there's now SFU for Windows (but only for XP Professional and > Windows 2003, not for XP Home and Vista, AFAIK). That's a cool solution > when you want to run Win32 and POSIX programs on the same system, and > maybe an alternative to using virtualization. But it is nothing for > developing consumer programs on Windows. > > Btw, has something tried to compile O'Caml on SFU? It's a 230M free > download. There seems to be gcc and lots of GNU stuff, too (yes, it's > from MS...). > > > > Also, Windows is just a bad platform for event-based programs, and you > > > want to do it to some extent (e.g. for watching all your child > > > processes). Only for socket handles there is a select() call. For all > > > other types of handles you cannot find out in advance whether the > > > operation would block or not. > > > > This is misinformation at best, FUD at worst. I'm no Microsoft fanboy, > > but the reality is quite opposite to what you claim. Windows has quite > > robust asynchronous I/O support. > > No, this is not misinformation, this is the result of digging deeply > into the Win32 API for an attempt to port Ocamlnet to Win32 (which will > finally happen to some degree). If you limit yourself to Win32 API, you're right that you won't get it to work the way you want to. As soon as you start digging into the DDK, there are ways to do it. > There's overlapped I/O, but the > difficulty is that you have to start an operation before you can watch > asynchronously for its completion. There is no way to check in advance > for that (and that was my claim). Also, there is a quite small limit for > the number of resources you can watch at the same time (I think 32 or > 64). > > Look at what Cygwin has done. Basically, they start helper threads for > emulating select(). For some cases, there is no real select() support, > e.g. the output side of pipes is always considered as writable. Only the > input side can be watched. A lot of that is done since they limit themselves to the API, and old API at that. SFU achieves it without much in the way of limits by using admittedly undocumented, albeit relatively understandable native APIs, and by gaining more direct access to the network stack. There's no reason nowadays why Cygwin folks couldn't do the same. Cheers, Kuba