* Gnat 3.15p & Windows & Hyperthreading Q @ 2005-03-26 0:28 tmoran 2005-03-26 4:45 ` Steve ` (3 more replies) 0 siblings, 4 replies; 10+ messages in thread From: tmoran @ 2005-03-26 0:28 UTC (permalink / raw) I'm told that a multitask program compiled with Gnat 3.15p and run under Windows XP Pro on a hyperthreaded machine, runs in the same total time as the same program using a single task. OTOH, when compiled with GNAT 5.02a1 and run on a dual-processor 400 MHz Celeron running Mandrake Linux 8.2, it runs about 50% faster with two rather than one tasks. Is the problem "hyperthreading", Windows, or Gnat 3.15p? ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Gnat 3.15p & Windows & Hyperthreading Q 2005-03-26 0:28 Gnat 3.15p & Windows & Hyperthreading Q tmoran @ 2005-03-26 4:45 ` Steve 2005-03-26 9:41 ` Pascal Obry ` (2 subsequent siblings) 3 siblings, 0 replies; 10+ messages in thread From: Steve @ 2005-03-26 4:45 UTC (permalink / raw) Another data point, but not one you asked for... I have seen Gnat 3.15p take advantage of dual Xeons on a W2k machine. So I don't think there is anything wrong in general with Gnat 3.15p on dual processors. Steve (The Duck) <tmoran@acm.org> wrote in message news:1IOdnWpX0_s6MdnfRVn-3A@comcast.com... > I'm told that a multitask program compiled with Gnat 3.15p and run > under Windows XP Pro on a hyperthreaded machine, runs in the same total > time as the same program using a single task. OTOH, when compiled with > GNAT 5.02a1 and run on a dual-processor 400 MHz Celeron running Mandrake > Linux 8.2, it runs about 50% faster with two rather than one tasks. > Is the problem "hyperthreading", Windows, or Gnat 3.15p? ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Gnat 3.15p & Windows & Hyperthreading Q 2005-03-26 0:28 Gnat 3.15p & Windows & Hyperthreading Q tmoran 2005-03-26 4:45 ` Steve @ 2005-03-26 9:41 ` Pascal Obry 2005-03-26 13:53 ` Marin David Condic 2005-03-29 18:33 ` Wiljan Derks 3 siblings, 0 replies; 10+ messages in thread From: Pascal Obry @ 2005-03-26 9:41 UTC (permalink / raw) tmoran@acm.org writes: > I'm told that a multitask program compiled with Gnat 3.15p and run > under Windows XP Pro on a hyperthreaded machine, runs in the same total > time as the same program using a single task. OTOH, when compiled with I don't think it is true. GNAT maps tasks to OS threads, so it could be a problem with the Windows XP used on the dual processor. Some WinXP (could be the case for the Home Edition) does not support multiproc. Pascal. -- --|------------------------------------------------------ --| Pascal Obry Team-Ada Member --| 45, rue Gabriel Peri - 78114 Magny Les Hameaux FRANCE --|------------------------------------------------------ --| http://www.obry.org --| "The best way to travel is by means of imagination" --| --| gpg --keyserver wwwkeys.pgp.net --recv-key C1082595 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Gnat 3.15p & Windows & Hyperthreading Q 2005-03-26 0:28 Gnat 3.15p & Windows & Hyperthreading Q tmoran 2005-03-26 4:45 ` Steve 2005-03-26 9:41 ` Pascal Obry @ 2005-03-26 13:53 ` Marin David Condic 2005-03-26 18:36 ` tmoran 2005-03-27 11:27 ` Simon Wright 2005-03-29 18:33 ` Wiljan Derks 3 siblings, 2 replies; 10+ messages in thread From: Marin David Condic @ 2005-03-26 13:53 UTC (permalink / raw) That seems strange. In the first case, is it a SINGLE processor machine? Or is it the same dual processor 400mhz Celeron in both cases? Depending on what exactly is in the tasks in question, it would be hard to imagine not seeing some improvement going multitasking with multiprocessors. (Task overhead shouldn't be THAT bad.) When dealing with the underlying OS, there might be lots of possible problems that might lock the process to a single processor & account for the lack of improvement. Also, is this just anecdotal or is there an actual benchmark program that could be looked at? MDC tmoran@acm.org wrote: > I'm told that a multitask program compiled with Gnat 3.15p and run > under Windows XP Pro on a hyperthreaded machine, runs in the same total > time as the same program using a single task. OTOH, when compiled with > GNAT 5.02a1 and run on a dual-processor 400 MHz Celeron running Mandrake > Linux 8.2, it runs about 50% faster with two rather than one tasks. > Is the problem "hyperthreading", Windows, or Gnat 3.15p? -- ====================================================================== Marin David Condic I work for: http://www.belcan.com/ My project is: http://www.jsf.mil/NSFrames.htm Send Replies To: m o d c @ a m o g c n i c . r "'Shut up,' he explained." -- Ring Lardner ====================================================================== ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Gnat 3.15p & Windows & Hyperthreading Q 2005-03-26 13:53 ` Marin David Condic @ 2005-03-26 18:36 ` tmoran 2005-03-28 13:16 ` Marin David Condic 2005-03-27 11:27 ` Simon Wright 1 sibling, 1 reply; 10+ messages in thread From: tmoran @ 2005-03-26 18:36 UTC (permalink / raw) > > I'm told that a multitask program compiled with Gnat 3.15p and run > > under Windows XP Pro on a hyperthreaded machine, runs in the same total > > time as the same program using a single task. OTOH, when compiled with > > GNAT 5.02a1 and run on a dual-processor 400 MHz Celeron running Mandrake > > Linux 8.2, it runs about 50% faster with two rather than one tasks. > > That seems strange. In the first case, is it a SINGLE processor machine? > Or is it the same dual processor 400mhz Celeron in both cases? > Also, is this just anecdotal or is there an actual benchmark program > that could be looked at? The original program was posted under "Ada bench : count words", as was the dual-Celeron timing. The hyperthreading timing was a personal communication. It's possible the person was mistaken in thinking they had hyperthreading turned on, with processor affinities set correctly. I'm inquiring further. So here's the benchmark. It reads a text file from Standard Input, preferably at least a megabyte to get a decent timing read, and prints line, word, and character counts to Standard Output. The number of CPU-heavy tasks is the number of elements of Counter : array(1 .. 2) of Counters; Probably increasing the buffer size, by lessening task interactions, would speed it up and improve the multi-tasking benefit. with Ada.Calendar, Ada.Streams, Ada.Streams.Stream_IO, Ada.Text_IO, Ada.Text_IO.Text_Streams; procedure Cwt is use Ada.Streams; use type Ada.Calendar.Time; T0 : Ada.Calendar.Time := Ada.Calendar.Clock; -- start timing T1 : Ada.Calendar.Time; subtype Buffer_Type is Stream_Element_Array(1 .. 4096); LF : constant Stream_Element := Character'pos(Ascii.LF); Is_Whitespace : constant array(Stream_Element) of Boolean := (Character'pos(Ascii.LF) | Character'pos(Ascii.HT) | Character'pos(' ') => True, others => False); -- "Counters" tasks run independently, asking Data_Source for buffer loads -- and tallying word and line counts. When done, they wait for their -- (partial) counts to be harvested, then terminate. task type Counters is entry Harvest(Line_Count, Word_Count : out Natural); end Counters; -- Data_Source is the IO task, supplying data as requested to Counters. -- Note that Data_Source counts the whitespace->non-white transitions -- at the ends of buffers. Counters' partial counts are added to that. -- Data_Source also counts the Total number of characters. task Data_Source is entry Get(Buffer : out Buffer_Type; Last : out Stream_Element_Offset); end Data_Source; task body Counters is Buffer : Buffer_Type; Last : Stream_Element_Offset; Lines, Words, Total : Natural := 0; In_Whitespace : Boolean; begin loop Data_Source.Get(Buffer, Last); exit when Last = 0; In_Whitespace := Is_Whitespace(Buffer(1)); for I in 1 .. Last loop if Is_Whitespace(Buffer(I)) then if Buffer(I) = LF then Lines := Lines + 1; end if; In_Whitespace := True; elsif In_Whitespace then In_Whitespace := False; Words := Words + 1; end if; end loop; exit when Last < Buffer'last; end loop; accept Harvest(Line_Count, Word_Count : out Natural) do Line_Count := Lines; Word_Count := Words; end; end Counters; Lines, Words, Total : Natural := 0; task body Data_Source is Stream : Ada.Text_IO.Text_Streams.Stream_Access; At_End : Boolean := False; In_Whitespace : Boolean := True; -- we must count at edges of buffer loads begin Stream := Ada.Text_IO.Text_Streams.Stream(Ada.Text_IO.Current_Input); loop select accept Get(Buffer : out Buffer_Type; Last : out Stream_Element_Offset) do if At_End then Last := 0; else Ada.Streams.Read(Ada.Streams.Root_Stream_Type'Class(Stream.all), Buffer, Last); Total := Total+Integer(Last); if Last > 0 then if In_Whitespace and not Is_Whitespace(Buffer(1)) then Words := Words+1; end if; In_Whitespace := Is_Whitespace(Buffer(Last)); end if; if Last < Buffer'last then At_End := True;end if; end if; end; or terminate; end select; end loop; end Data_Source; A_Line_Count, A_Word_Count : Natural := 0; Counter : array(1 .. 2) of Counters; begin for i in Counter'range loop Counter(i).Harvest(A_Line_Count, A_Word_Count); Lines := Lines+A_Line_Count; Words := Words+A_Word_Count; end loop; T1 := Ada.Calendar.Clock; Ada.Text_IO.Put_Line(Natural'Image(Lines) & Natural'Image(Words) & Natural'Image(Total)); Ada.Text_IO.Put_Line("took" & Duration'Image(T1 - T0)); end Cwt; ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Gnat 3.15p & Windows & Hyperthreading Q 2005-03-26 18:36 ` tmoran @ 2005-03-28 13:16 ` Marin David Condic 0 siblings, 0 replies; 10+ messages in thread From: Marin David Condic @ 2005-03-28 13:16 UTC (permalink / raw) On a quick scan, I don't see anything obvious. Let me take a look at it and I'll see if I spot anything that might be problematic. MDC tmoran@acm.org wrote: > > The original program was posted under "Ada bench : count words", > as was the dual-Celeron timing. The hyperthreading timing was a personal > communication. It's possible the person was mistaken in thinking they > had hyperthreading turned on, with processor affinities set correctly. > I'm inquiring further. > > So here's the benchmark. It reads a text file from Standard Input, > preferably at least a megabyte to get a decent timing read, and prints > line, word, and character counts to Standard Output. The number of > CPU-heavy tasks is the number of elements of > Counter : array(1 .. 2) of Counters; > Probably increasing the buffer size, by lessening task interactions, > would speed it up and improve the multi-tasking benefit. > > with Ada.Calendar, > Ada.Streams, > Ada.Streams.Stream_IO, > Ada.Text_IO, > Ada.Text_IO.Text_Streams; > procedure Cwt is > use Ada.Streams; > use type Ada.Calendar.Time; > > T0 : Ada.Calendar.Time := Ada.Calendar.Clock; -- start timing > T1 : Ada.Calendar.Time; > > subtype Buffer_Type is Stream_Element_Array(1 .. 4096); > > LF : constant Stream_Element := Character'pos(Ascii.LF); > Is_Whitespace : constant array(Stream_Element) of Boolean > := (Character'pos(Ascii.LF) | Character'pos(Ascii.HT) > | Character'pos(' ') => True, others => False); > > -- "Counters" tasks run independently, asking Data_Source for buffer loads > -- and tallying word and line counts. When done, they wait for their > -- (partial) counts to be harvested, then terminate. > > task type Counters is > entry Harvest(Line_Count, Word_Count : out Natural); > end Counters; > > -- Data_Source is the IO task, supplying data as requested to Counters. > -- Note that Data_Source counts the whitespace->non-white transitions > -- at the ends of buffers. Counters' partial counts are added to that. > -- Data_Source also counts the Total number of characters. > > task Data_Source is > entry Get(Buffer : out Buffer_Type; > Last : out Stream_Element_Offset); > end Data_Source; > > task body Counters is > Buffer : Buffer_Type; > Last : Stream_Element_Offset; > Lines, Words, Total : Natural := 0; > In_Whitespace : Boolean; > begin > loop > Data_Source.Get(Buffer, Last); > exit when Last = 0; > In_Whitespace := Is_Whitespace(Buffer(1)); > for I in 1 .. Last loop > if Is_Whitespace(Buffer(I)) then > if Buffer(I) = LF then > Lines := Lines + 1; > end if; > In_Whitespace := True; > elsif In_Whitespace then > In_Whitespace := False; > Words := Words + 1; > end if; > end loop; > exit when Last < Buffer'last; > end loop; > accept Harvest(Line_Count, Word_Count : out Natural) do > Line_Count := Lines; > Word_Count := Words; > end; > end Counters; > > Lines, Words, Total : Natural := 0; > > task body Data_Source is > Stream : Ada.Text_IO.Text_Streams.Stream_Access; > At_End : Boolean := False; > In_Whitespace : Boolean := True; -- we must count at edges of buffer loads > begin > Stream := Ada.Text_IO.Text_Streams.Stream(Ada.Text_IO.Current_Input); > loop > select > accept Get(Buffer : out Buffer_Type; > Last : out Stream_Element_Offset) do > if At_End then Last := 0; > else > Ada.Streams.Read(Ada.Streams.Root_Stream_Type'Class(Stream.all), > Buffer, Last); > Total := Total+Integer(Last); > if Last > 0 then > if In_Whitespace and not Is_Whitespace(Buffer(1)) then > Words := Words+1; > end if; > In_Whitespace := Is_Whitespace(Buffer(Last)); > end if; > if Last < Buffer'last then At_End := True;end if; > end if; > end; > or terminate; > end select; > end loop; > end Data_Source; > > A_Line_Count, A_Word_Count : Natural := 0; > > Counter : array(1 .. 2) of Counters; > > begin > > for i in Counter'range loop > Counter(i).Harvest(A_Line_Count, A_Word_Count); > Lines := Lines+A_Line_Count; > Words := Words+A_Word_Count; > end loop; > > T1 := Ada.Calendar.Clock; > > Ada.Text_IO.Put_Line(Natural'Image(Lines) > & Natural'Image(Words) > & Natural'Image(Total)); > Ada.Text_IO.Put_Line("took" & Duration'Image(T1 - T0)); > end Cwt; -- ====================================================================== Marin David Condic I work for: http://www.belcan.com/ My project is: http://www.jsf.mil/NSFrames.htm Send Replies To: m o d c @ a m o g c n i c . r "'Shut up,' he explained." -- Ring Lardner ====================================================================== ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Gnat 3.15p & Windows & Hyperthreading Q 2005-03-26 13:53 ` Marin David Condic 2005-03-26 18:36 ` tmoran @ 2005-03-27 11:27 ` Simon Wright 1 sibling, 0 replies; 10+ messages in thread From: Simon Wright @ 2005-03-27 11:27 UTC (permalink / raw) Marin David Condic <nobody@noplace.com> writes: > That seems strange. In the first case, is it a SINGLE processor > machine? Or is it the same dual processor 400mhz Celeron in both > cases? It's my dual-processor Celeron, and it doesn't run Windows. -- Simon Wright 100% Ada, no bugs. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Gnat 3.15p & Windows & Hyperthreading Q 2005-03-26 0:28 Gnat 3.15p & Windows & Hyperthreading Q tmoran ` (2 preceding siblings ...) 2005-03-26 13:53 ` Marin David Condic @ 2005-03-29 18:33 ` Wiljan Derks 2005-03-30 8:48 ` Adrien Plisson 3 siblings, 1 reply; 10+ messages in thread From: Wiljan Derks @ 2005-03-29 18:33 UTC (permalink / raw) I did some performance tests on XP profesional with hyperthreading on a 2.8Ghz P4. For that I used some code that checks the CPU performance. I did this by making some compute procedure and check how often it is calculated. In my program I did make multiple tasks to check the functioning of hyper threaded. It turns out that hyper threading does not help at all with the total perfromance that is available. My conclusions where as follows: * When hyperthreading is turned of, the system can do X computations. * When hyperthreading is turned on and both threads are loaded, each of them can typically do less then X/2 computations. Thus turning on hyper threading gives basically two CPU which are both half speed when being used. When one of the CPU's is free, the other is faster. So it looks like one CPU is multiplexed in time (but very fast). The only advantage that hyper threading has, is that the system might be more responsive. Thus when accidentally locking one CPU at high priority, one can still break into the system (using the other CPU). Wiljan ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Gnat 3.15p & Windows & Hyperthreading Q 2005-03-29 18:33 ` Wiljan Derks @ 2005-03-30 8:48 ` Adrien Plisson 2005-04-01 7:09 ` tmoran 0 siblings, 1 reply; 10+ messages in thread From: Adrien Plisson @ 2005-03-30 8:48 UTC (permalink / raw) Wiljan Derks wrote: > The only advantage that hyper threading has, is that the system might be > more responsive. > Thus when accidentally locking one CPU at high priority, one can still break > into the system (using the other CPU). ok, let's release some misconceptions about HyperThreading: an HyperThreading enabled processor DOES NOT have 2 cores. it's not clear at all when you look at Intel's overview of HyperThreading. they really like to tell it runs as if it were 2 processors. this may look like true for simple office tasks, which are not computationnally intensive. unfortunately, for software developpers used to multitasking and trying to get the most of their system, it is evident that it is NOT 2 processors. actually, an HT processor has one core, which makes it no faster than a single processor. what's different is that it has 2 sets of "states", allowing for more efficient context switches. as noted by Wiljan, this makes the system more responsive. but this paper does explain it in more details: http://www.intel.com/business/bss/products/hyperthreading/server/ht_server.pdf -- rien ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Gnat 3.15p & Windows & Hyperthreading Q 2005-03-30 8:48 ` Adrien Plisson @ 2005-04-01 7:09 ` tmoran 0 siblings, 0 replies; 10+ messages in thread From: tmoran @ 2005-04-01 7:09 UTC (permalink / raw) > a single processor. what's different is that it has 2 sets of > "states", allowing for more efficient context switches. as noted by > Wiljan, this makes the system more responsive. > > but this paper does explain it in more details: > http://www.intel.com/business/bss/products/hyperthreading/server/ht_server.pdf That paper doesn't tell much, since it says resources unused by one virtual cpu are available to the other. If there are lots of such resources, then two threads ought to run with almost no interference, ie, nearly twice as fast as sequentially. If there are bottleneck resources then clearly things are single-file and no different than a software implemented time-slicing multitasking. And the paper doesn't tell which. Here's a little program which should create two definite and different patterns on Windows/Task Manager/Performance/CPU History(s). Compile with "gnatmake -gnato cpu2" - no optimization desired. Run Task Manager/Performance so it displays two CPU History windows (for multi or hyperthreaded CPUs). Start a separate Command Prompt window and run cpu2.exe. It will run almost 100 seconds making pattern(s) on the CPU History window(s), and some text output. On a single CPU machine, the pattern should be like a short spike 5 seconds zero use 38 seconds of 100% CPU use, ie, the graph pinned at the top. 21 seconds containing two spikes of CPU use. 33 seconds of 100% use. total 97 seconds On a multi or hyperthreaded CPU, I would expect CPU 1 window CPU 2 window a short spike 5 seconds zero use 5 seconds zero use 24 seconds at 100% 24 seconds with 3 spikes 40 seconds containing 5 spikes 40 seconds of zero use 24 seconds at 100% 24 more seconds of zero use total 93 seconds For a single CPU run, here's the text output I got: 2.85042E+07 loops/sec start both tasks task 1 now quiet 43.830936614 task 1 busy again 64.005100369 task 2 done 90.933717554 task 1 done 97.452995004 with Ada.Calendar, Ada.Exceptions, Ada.Text_IO; procedure Cpu2 is use type Ada.Calendar.Time; Loops_Per_Second: Float := 0.0; -- set by Find_Speed procedure High(T : in Duration) is N : constant Positive := Integer(Float(T) * Loops_Per_Second); X : Integer := 0; begin for I in 1 .. N loop X := X + 1; end loop; end High; procedure Low(T : in Duration) is begin delay T; end Low; task Two is entry Start(Wavelength: in Duration; Cycle_Count: in Natural); end Two; procedure Find_Speed is T0 : constant Ada.Calendar.Time := Ada.Calendar.Clock; begin Loops_Per_Second := 10_000_000.0; High(1.0); Loops_Per_Second := Loops_Per_Second / Float(Ada.Calendar.Clock - T0); end Find_Speed; T0 : Ada.Calendar.Time; task body Two is W : Duration; N : Natural; begin accept Start(Wavelength: in Duration; Cycle_Count: in Natural) do W := Wavelength; N := Cycle_Count; end Start; delay 0.01; -- let caller run for Cycle in 1 .. N loop High(W / 2); Low(W / 2); end loop; Ada.Text_IO.Put_Line("task 2 done" & Duration'Image(Ada.Calendar.Clock - T0)); exception when Oops : others => Ada.Text_IO.Put_Line("task two:" & Ada.Exceptions.Exception_Information(Oops)); end Two; begin Find_Speed; Ada.Text_IO.Put_Line(Float'Image(Loops_Per_Second) & " loops/sec"); T0 := Ada.Calendar.Clock; delay 5.0; Ada.Text_IO.Put_Line("start both tasks"); Two.Start(Wavelength => 8.0, Cycle_Count => 8); High(25.0); Ada.Text_IO.Put_Line("task 1 now quiet" & Duration'Image(Ada.Calendar.Clock - T0)); delay until T0 + 64.0; Ada.Text_IO.Put_Line("task 1 busy again" & Duration'Image(Ada.Calendar.Clock - T0)); High(25.0); Ada.Text_IO.Put_Line("task 1 done" & Duration'Image(Ada.Calendar.Clock - T0)); exception when Oops : others => Ada.Text_IO.Put_Line(Ada.Exceptions.Exception_Information(Oops)); end Cpu2; ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2005-04-01 7:09 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2005-03-26 0:28 Gnat 3.15p & Windows & Hyperthreading Q tmoran 2005-03-26 4:45 ` Steve 2005-03-26 9:41 ` Pascal Obry 2005-03-26 13:53 ` Marin David Condic 2005-03-26 18:36 ` tmoran 2005-03-28 13:16 ` Marin David Condic 2005-03-27 11:27 ` Simon Wright 2005-03-29 18:33 ` Wiljan Derks 2005-03-30 8:48 ` Adrien Plisson 2005-04-01 7:09 ` tmoran
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox