From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by yquem.inria.fr (Postfix) with ESMTP id BD896BB91 for ; Fri, 17 Dec 2004 03:10:07 +0100 (CET) Received: from galileo.rift (host217-44-198-112.range217-44.btcentralplus.com [217.44.198.112]) by concorde.inria.fr (8.13.0/8.13.0) with ESMTP id iBH2A7IJ013976 for ; Fri, 17 Dec 2004 03:10:07 +0100 Received: from chasm by galileo.rift with local (Exim 3.35 #1 (Debian)) id 1Cf7ZG-0001Vp-00 for ; Fri, 17 Dec 2004 02:10:06 +0000 Subject: Threaded ocaml code, native threads, and linux SMP To: caml-list@yquem.inria.fr Date: Fri, 17 Dec 2004 02:10:06 +0000 (GMT) X-Mailer: ELM [version 2.4ME+ PL66 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Message-Id: From: Julian X-Miltered: at concorde with ID 41C23FFF.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Spam: no; 0.00; ocaml:01 threads:01 wrote:01 ocaml:01 rec:01 ocamlopt:01 -thread:01 cmxa:01 threads:01 cmxa:01 wrote:01 incorrectly:01 unix:01 pair:01 pair:01 X-Spam-Checker-Version: SpamAssassin 3.0.0 (2004-09-13) on yquem.inria.fr X-Spam-Status: No, score=0.4 required=5.0 tests=DNS_FROM_RFC_ABUSE, FORGED_RCVD_HELO autolearn=disabled version=3.0.0 X-Spam-Level: I wrote the following CPU-bound function in order to test the Thread module in ocaml: let rec loop pair = match pair with (100000, 50000) -> () | ( i, 50000) -> loop (i+1, 0) | ( i, j) -> loop (i, j+1) ;; This function was used in two test programs: * Version 1 * let t1, t2 = Thread.create loop (0,0), Thread.create loop (0,0) ;; Thread.join t1;; Thread.join t2;; * Version 2 * loop (0,0); loop (0,0);; The test programs were each compiled with the following command: (ocaml 3.08, debian sid, linux kernel 2.6): ocamlopt -thread -o unix.cmxa threads.cmxa .ml I then tried running the two versions on an SMP machine. I found that whereas I expected version 1 to run roughly twice as fast, they actually took the same amount of time. Closer inspection using "ps" revealed that only one processor was being used. When I wrote a similar test program in C, calling the pthread functions directly, the threads were run on separate CPUs as expected. The "ldd" command reveals that the C version and the ocaml version were relying on the same native pthread library. So why doesn't the ocaml version use 2 processors? Is it a flaw with my program? Did I compile the program incorrectly? Thanks for any help you can give, Julian