latest posts

Silicon Graphics Onyx2

Intro

Those following my blog for some time know my passion for Silicon Graphics machines. After having picked up a Silicon Graphics Onyx 2 last fall I finally had some time to get the "big iron" up and running. The Onyx 2 is interesting in that it is the one of the last "board" based deskside graphics machines. Following the Onyx2 the only comparable workstation would be the Tezro offering up to 4 R16000 1ghz CPUs and a 128mb V12 Odyssey graphics card. My specific Onyx2 CPU wise was nearly maxed out with 4 400mhz R12000 MIPS cpus and completely maxed out in ram at 8gb. Graphics systems wise it was pretty low end. It came with a DG5-2, GE14-2 and 1 RM8-16 Raster Manager, effectively making it a Reality graphics system. Fortunately eBay in time had a DG5-8, GE16-4 and 2 RM10-256 boards for extremely cheap so after swapping the boards I now have an InfiniteReality3 system. The InfiniteReality4 (the last generation) only differs by offering the RM11-1024 (1gb of texture memory) versus the 256mb per board I have in the RM10s in addition to Pixel Fill Rate differences of nearly double.

Silicon Graphics Onyx2 - GE14-2
Geometry Engine (GE) 14-2

Silicon Graphics Onyx2 - GE16-4
Geometry Engine (GE) 16-4

Silicon Graphics Onyx2 - RM8-16
Raster Manager (RM) 8-16

Silicon Graphics Onyx2 - RM10-256
Raster Manager (RM) 10-256

Like most of the machines I have gotten second hand they come with the original slower scsi drives. This Onyx2 came with the original 9gb IBM Ultra-Wide SCSI 2 hard drive with IRIX 6.5.8 on it. Knowing from the listing the cd-rom drive was faulty, I simply copied all of the IRIX 6.5.30 cds over NFS to upgrade it. After which like I had done with my Silicon Graphics Origin 300 back in 2012. For those inquiring I chose to my goto Ultra 320 SCSI Drive, the Maxtor Atlas 15K II. Silicon Graphics Onyx2 - Original Harddrive
Silicon Graphics Onyx2 - Replacement Harddrive

A look at my Onyx 2 all wired up, note this was before I swapped in the DG5-8:

Silicon Graphics Onyx2 - Back wired up

I should note anyone curious getting an Onyx2, you should keep it in a cool place or outside of a bedroom as the fans (which are temperature controlled) when in full speed are quite loud.

Benchmarks

Knowing one of the first things I do after getting a new system up and running is benchmarking it with my own cross-platform CPU benchmark, jcBENCH. Wanting to compare the R12000 and R14000 architectures, specifically with my goto 4xR14000 600mhz Silicon Graphics Origin 300 I ran jcBENCH. Surprisingly with the extra 200mhz (50% increase) and enhancements the R14000 MIPS cpu brought, my Origin 300 is over 3 times faster in both integer and floating point tests.

Since I had never had an InfiniteReality system before I wanted to test it with something semi-recent such as Quake 3. Knowing it was not optimized for gaming, let alone optimized for IRIX I was still intrigued.

For my Quake 3 benchmarks I used the neko_quake3-1.36.tardist release leaving everything on the highest settings except filtering which I left on bilinear. For each test in Quake 3 the only things I changed were the resolution and bit depth. No other processes were running.

Silicon Graphics Onyx2 - Quake 3 Benchmarks

The results were pretty interesting. Being on just a step down from the highest end cpu I figured the performance might actually be better with the InfiniteReality3 installed. If anyone reading this has an IR3 and 4xR14k Onyx2 please run the same tests and let me know your results. Overall the biggest jump was swapping the RM8-16 with an RM10-256, especially when using 32bit bit depth. What I found most interesting is the addition of a 2nd RM10-256 and swapping out the GE14-2 for a GE16-4 brought upon diminishing returns. This leads me to believe at that point Quake 3 became CPU limited with my 400mhz R12000s. Knowing that this particular build is single threaded I am curious how my 600mhz R14k Fuel with a V10 would perform in comparison (a test I will do in the coming weeks).

Closing Thoughts

For a machine that if bought new in May 2001 would cost $252536 (per this pricing sheet), I feel as though I have a piece of history that for a time blew away what was delivered by the PC and Mac worlds. Based on my own research comparing systems with PCs of the time (and other workstation manufacturers like DEC and Sun), the Onyx2 was one of the last extremely competitive offerings Silicon Graphics had. One could argue the Octane 2 was the last. Companies like 3dfx (interestingly enough had several Silicon Graphics employees) and AMD drove the PC industry forward with their Voodoo and Athlon products respectively; the "death of the workstation" so to speak.

Going forward with the Onyx 2 I hope to add some Onyx 2 specific optimizations to the ioquake3 project taking advantage of the Silicon Graphics OpenGL extensions that could speed up rendering. Along this path I would also focus on V10/V12 optimizations to bring Fuel and Tezro machines a more optimized experience.

Intro

NeXTstation Turbo Rom
A while back in Summer 2011, I had this strange desire to obtain "classic" computers from every manufacturer that I had grown up hearing things about, obviously couldn't afford. Anyone following my blogs knows I have amassed quite a collection of Silicon Graphics machines along with a few DEC, Sun and late PowerPC-era Apple machines (G4 and G5). One manufacturer that had previously alluded me was NeXT. While still living at my parent's house back in 2004 I had an opportunity to purchase a NeXTcube, the pinacle of NeXT computers. Unfortunately, as an undergrad college student, I just couldn't justify the $300 at the time for a 33mhz computer that I might turn on every now and then. Fast forward a few years to 2011 shortly after Steve Jobs passed away, the prices on eBay for NeXT computers skyrocketed. It could have just been a coincidence, coupled with the fact that there were supposedly only 50,000 NeXT computers built between 1989 and 1993. Fast forward another couple years, prices seemed to have almost hit rock bottom for the NeXTstation Turbo, so I finally broke down and got one in near mint condition.

Inside Look

For those looking into purchasing a NeXTstation computer, a couple things to know before diving in:

-There are 4 models of the NeXTstation: regular (mono), Color, Turbo and Color Turbo. The main differences outside of supporting color in the Color models (4096 colors btw), is the speed of the Motorola 68040 (33mhz for Turbo models, 25mhz for non) and the maximum amount of ram the motherboard can take. For the Turbo models 128mb of ram is supported (72pin SIMMS, also compatible with the later year 68040 Macintosh models). For the non-Turbo models you're limited to 32mb of ram.

-The power supply is extremely picky amount how much draw your hard drive can utilize. I thankfully read a ton of posts regarding the maximum power draw which is extremely low (no Maxtor Atlas 15k II Ultra 320 drives unfortunately). By default, any drive with the older SCSI I 50pin internal connector should be fine. Another element is the heat output of a 15k drive for instance. There is only a single fan in the NeXTstation. Also the partitions have a 4gb limit, so if you have a larger drive, just remember to partition it in 4gb blocks

-By default there is no "VGA" connector, thankfully I was able to procure a Y-VGA Cable (one end to the NeXTstation, one to my monitor and one to the Soundbox) so I could use an Acer LED I had laying around.

Onto my NeXTstation Turbo machine specifically:

-Motorola 68040 33mhz CPU
-128MB of RAM
-2gb Quantum Fireball SCSI I Hard Drive
-2.88MB 3.5" Floppy Drive

NeXTstation Turbo - Inside
NeXTstation Turbo Rom
NeXTstation Turbo - RAM
Specifically for the Turbo models you'll need 72pin 70ns SIMMs (on a historical side note in December 1992 an 8MB SIMM went for $225). On eBay right now you can get 4x32mb SIMMs for $40 shipped, so keep an eye out. On a side note, a quick way to know if it's a Turbo board or not is if there are only 4 ram sockets instead of the 8 on non- turbo boards.

NeXTstation Turbo - Back
Note the 8P8C 10baseT ethernet connector - very handy to have it built-in compared to other machines of this era that still only had AUI or BNC connectors.
NeXTstation Turbo - Hard Drive
50pin SCSI I drives are used, which aren't anywhere close to the speed I'm used to in my SGI or Sun machines with a Maxtor Atlas 15k II Ultra 320 drive
NeXTstation Turbo - Power Supply

NeXTstep

Having never used NeXTstep, I was unprepared for what to expect. The only operating systems from that era I've used are Windows 3.x, MS-DOS and IRIX 5.3. I know 3.3 came out in February 1995, but it seems as though that really only updated the CPU Architecture support rather than a feature release, so I'll be comparing it to operating systems released around October 1993 (when 3.2 was released).

Turning on the NeXTstation via the power button on the keyboard (shown below), you're presented with a few startup screens before the login prompt:

NeXTstation Turbo - Power Button

NeXTstation Turbo - Boot Sequence

NeXTstation Turbo - NeXTstep Boot Sequence

NeXTstation Turbo - NeXTstep Login Prompt

Immediately I came to the realization I hadn't used a monochrome computer ever as the first computer I ever used (a Tandy 1000) had 16 color support, though games like Falcon and Test Drive I remember playing in black and white. Upon logging in, I noticed the computer as Jobs had wanted, was silent outside of the hard drive spinning. The interface, similar to IRIX, offered something similar to IRIX's Toolchest, but different functionality mapping to keyboard shortcuts. Something I didn't really didn't note at first was the command button below the space bar on the keyboard. By holding down the command button and s for instance in the text editor would save. Similar to the Control+S we're used to today, but easier to execute in my opinion with your left thumb.

One of the first things I did was try NFS Mounting. I created a mount on my Windows Server 2012 R2 NAS with semi-recent ports of GCC, BASH and other "standard" software. Sure enough it was picked up by NeXTstep and I was copying files between the machines. Kind of interesting that machines of different architectures (x86- 64 vs m68k) and 20 years apart, communicating over the same protocol have 0 issues.

For those curious, I've made local copies of the latest versions of GCC and Bash available here:
Bash
CC Tools for GCC
GCC 3.4.6
Updated Headers for GCC

Installing packages is a bit more modern than I was used to with IRIX. Each "package" has a modern installer, as opposed to tardists in IRIX.

NeXTstation Turbo - Installing BASH

One thing to note when installing Bash (or any other shell), update the /etc/shells file with the path to the new shell like so:
NeXTstation Turbo - Adjusting Shells

Without updating that file, you won't be able to utilize the new shell when adding/modifying users in the GUI.

What's NeXT?

Yesterday I started working on the jcBENCH port for NeXTstep/m68k, I should have that wrapped up within a week. I am very interested in seeing how it compares to a 33mhz MIPS R3000 Silicon Graphics Indigo that came out a year before the NeXTstation (July 1991), albiet at a little bit higher price ($7,995 vs $6,500), but offered color and additional video options.

Intel Galileo Development Board
After hearing about and seeing Windows IoT while at BUILD this April, I was waiting for an opportunity to really get started with it. Fortunately, this weekend I was near a Fry's Electronics and picked up an Intel Galileo Development Board for nearly half off.

Intel Galileo Development Board - All included parts
Inside the box you'll find the various power plugs used around the world, a USB cable, the development board and the power brick itself.

After reading through the very thorough (no need to ellaborate on the steps) Updating your Intel Galileo I was able to get Windows IoT onto a Micro SDHC card. Make sure to connect to the Client Port (the one closest to the Ethernet Port).

Installing Windows IoT to Galileo
30 minutes into the installation:

Installing Windows IoT to Galileo - 30 minutes in
The whole process took 45 minutes on my HP dv7 laptop to install to my SDHC card. For those curious I chose to use a Sandisk Ultra Plus 16gb Micro SDHC card, while by no means the fastest (the Sandisk Extreme Pro from what I've read is the fastest), it was the most cost effective at $15.

Intel Galileo Development Board - All included parts
After unplugging the power from the Galileo, removing the SDHC card from my PC and popping it into the Galileo I was pleasantly surprised to be able to Telnet in after a minute or two.

Windows IoT with Telnet into Intel Galileo
For those curious, as I have said in other posts, I find XShell to be the best SSH/SERIAL/TELNET client for Windows, best of all it is free for non-commercial use.

After installing WindowsDeveloperProgramforIOT.msi, I started porting jcBENCH to Windows IoT. Since jcBENCH is C++ and written in a extremely portable manner the only big thing I had to do was recompile the pthreads Win32 library to not take advantage of SSE instructions as the Galileo does not support them. The other thing to note is if you want to run a program in a more traditional route, simply do the following:

[csharp] int _tmain(int argc, _TCHAR* argv[]) { ArduinoInit(); // rest of your program here return 0; } [/csharp] The base template that is installed in Visual Studio 2013 is focused more on applications that loop continuously (which makes sense given the headless nature of Windows IoT).

So how did the Intel Galileo fair in jcBENCH?

[bash] C:\jcBench>jcBENCH.cmdl jcBENCH 1.0.850.0531(x86/WinIoT Intel Galileo Edition) (C) 2012-2014 Jarred Capellman Usage: jcBench [Number of Objects] [Number of Threads] Example: jcBench 100000 4 This would process 100000 objects with 4 threads Invalid or no arguments, using default benchmark of 10000 objects using 1 CPUS CPU Information --------------------- Manufacturer: GenuineIntel Model: Intel Quartz X1000 Count: 1x399.245mhz Architecture: x86 --------------------- Running Benchmark.... Integer: 1 Floating Point: 1 Submit Result (Y or N):n Results can be viewed and compared on http://www.jcbench.com [/bash] Given that it is a single 400mhz Pentium (P5 essientially) - not bad, but not great. It got a score of 1 in both Floating Point operations and Integer Operations, given the baseline is a Dual Core AMD C-60 running at a much faster clock rate. This isn't discouraging, especially given the applications for this platform including my own ideas from back in March 2014 (at the bottom of the post) having my own Network Monitoring software. Given the lower power usage and the challenge of making my C++ code fast enough to do those operations, I'm up for the task.

As for what is next with the Intel Galileo? I have an Intel Centrino 6235 mPCIe 802.11n/Bluetooth 4.0 card coming today for my Galileo, as it is one of the few confirmed working WiFi cards. In addition I have a 16gb Sandisk Extreme Pro SDHC card on its way to test whether or not the "best" card has any impact on a real-world application. For those curious you can now obtain the Windows IoT version of jcBENCH on the official jcBENCH page.

From a developer perspective, for those needing to make use of Pthreads Library, you can download the source and binary compatible with Windows IoT here.

Over the weekend I picked up an AMD Athlon 5150 APU (4x1.6ghz) along with a MSI AM1I motherboard from Frys on sale for $59. A month or two ago I purchased the 5350 APU (4x2ghz) and an ASUS AM1-I, which had been working great since I set it up so I was curious how the 5150 performed along with the MSI motherboard.

MSI AM1I and AMD 5150

Big differences between the two is the inclusion of a Mini-PCLe slot (for a WiFi or SSD card) along with a PCIe 2.0 x16 slot (x4 mechanical). MSI AM1I and AMD 5150

AMD 5150

For those that have followed my blog for a while, I swapped the motherboard into my Lian Li PC-Q03B case that I bought back in 2012. In the time since I setup that machine, I had installed XBMC to stream TV, Movies and Music from my NAS (to be written up at a later date). Over time it became apparent the low powered AMD C-60 I had in there wasn't truly up to the task of streaming higher bit-rate 1080p video.

One thing I wasn't a big fan of after booting up the machine was MSI's choice of bios in comparison to my ASUS motherboards:
MSI AM1 BIOS

BIOS aside, I had no issues with the motherboard, Windows 8.1 updated itself without the need for a reinstall and I was ready to benchmark it.

Interestingly enough comparing jcBENCH the 5150 is roughly 40% slower in both Integer and Floating Point than my 5350. I included a couple other systems for comparisons:

AMD 5150 Benchmark Results

In working on the NetBSD-mips ports of jcBench and jcDBench, I realized I never did a Solaris port of either when working on my Sun Blade 2500 last Fall. Without further adieu I am proud to announce the initial releases of both jcBench and jcDBench for sparc/Solaris compiled with g++ 4.80. Both have 0 dependencies so just extract and run. Man pages and a true installer will come with the big 1.0 release (more on that at a later date).

You can download jcBench 0.8.753.0318 here.

You can download jcDBench 0.1.48.0318 here.

No known issues in my testing on Solaris 5.10 with my Sun Blade 2500.

Any suggestions, issues, comments etc. just leave a comment below and I'll get back to you as soon as possible.
After a little bit of work on both getting the platform specific code working perfectly - I am proud to announce the initial releases of both jcBench and jcDBench for mips/NetBSD. Both have 0 dependencies so just extract and run. Man pages and a true installer will come with the big 1.0 release (more on that at a later date).

You can download jcBench 0.8.752.0306 here.

You can download jcDBench 0.1.47.0312 here.

No known issues in my testing on NetBSD 5.2.2 with my Cobalt Qube 2.

Any suggestions, issues, comments etc. just leave a comment below and I'll get back to you as soon as possible.

Gateway rebadged Cobalt Qube2 - Front
Gateway rebadged Cobalt Qube2 - Rear

Introduction

Ever since I saw one of these devices about 10 years ago I had always wanted to own one, but were always out of the price point I’d pay for a 14 year old network appliance. Low and behold I was able to finally acquire the Gateway rebadged version (unknowingly a rare version) for $41 shipped recently in near perfect condition.

For those that may be unaware, Cobalt Networks, Inc originally released the Qube 2 in 2000 and in September 2000, Sun Microsystems purchased Cobalt Networks (finalized in December 2000), which in turn in 2003 ended the entire line. For more information on the story behind the development, I highly suggest reading the Startup Story of Cobalt, a very neat story of bringing an idea to fruition (and to a $2.1 billion buyout in 4 years).

Specifications

The Qube and Qube 2 are interesting devices in that they run MIPS R5k cpus (150 MHz RM5230 and 250 MHz RM5231-250-Q respectively). Those following my blog know I am a huge fan of RISC cpus especially MIPS so it was neat for me to get to play around with MIPS in a machine outside of a Silicon Graphics workstation or server, on top of a semi-current operating system. I should note for those curious you can run NetBSD on some SGI systems, but if you have a Silicon Graphics machine why wouldn’t you want to run IRIX?

My particular model has only 64MB of ram, which can be upgraded to 256MB via 2 128MB SIMMs. The Qube 2 requires a special 72pin EDO SIMM running at 3.3V. Before buying any ram second hand via eBay, Flea Market etc. be sure it is 3.3V. On eBay as of this writing there is one vendor with a stock pile of 128MB SIMMS for a fairly reasonable price – so if you’re in the market for a Qube or have one and running with the stock amount I recommend obtaining the ram now before it spikes because of the obscurity of the ram or worse the lack of supply anywhere.

The IO Board itself is interesting in that it connects to the CPU Board via what looks to be a 32bit 33mhz PCI Slot – meaning the 2 10/100 DEC 21143 Ethernet controllers, VT82C586 VIA ATA 33 controller and any PCI card in the additional slot compete for that ~133 MB/sec bandwidth versus other implementations of the time where each of those devices (or at least a few) would have been on their own controllers. Thinking about that further based on the aforementioned Startup Story of Cobalt and their thinking of making the Qube Dual CPU – maybe the idea was to simply drop another CPU Board into the opposing PCI Slot while also allowing the OEM or customer to drop in a modem (like Gateway did) or another PCI card?

Another note – temptation might be to throw a Western Digital Black 7200rpm SATA II drive with a SATA->PATA adapter, the tiny exhaust fan on the back of the Qube might not be enough to cool the machine down let alone the additional power requirements on the older power supplies. I highly recommend one of the following: keep with a 5400rpm ATA drive from that era, IDE -> Compact Flash Adapter (slowest option by far) or SATA I/II SSD with a SATA -> PATA converter.

Inside the Qube 2

Gateway rebadged Cobalt Qube2 – CPU Board
Gateway rebadged Cobalt Qube2 - CPU
Gateway rebadged Cobalt Qube2 – IO Board
Gateway rebadged Cobalt Qube2 – Seagate ATA IV 20GB Hard Drive
Gateway rebadged Cobalt Qube2 - RAM

Pre-Installation Notes

Seeing as how things go away (especially when the product line has been EOL for 10+ years) I’m locally hosting the Cobalt Qube 2 User Manual, which was helpful in figuring out how to open the Qube 2 properly.

In addition, for those curious the proper Serial Port Settings are 115,200 Baud Rate, 8 Data Bits, 1 Stop Bits, No Parity and No Flow Control. I found it gave me piece of mind to have the serial port connected to my PC during install because outside of the Qube 2’s LCD screen you will have no other indication of what is occurring.

A good SSH/TELNET/SERIAL/RLOGIN client for Windows is the Netsarang’s Xshell, which is free for home/student work (I prefer it over PuTTY for those curious).

Installing NetBSD

Gateway rebadged Cobalt Qube2 - Installing
I don’t want to simply regurgitate the very informative NetBSD/cobalt Restore CD HOWTO, but to put it simply:

Download the latest ISO from the NetBSD site. As of this writing, the latest is 5.2.2 released on 2/1/2014.

Obtain a crossover Cat5 cable or use an adapter and connect two Cat5(e) cables from the Primary Ethernet port on the Qube to your device

Burn the ISO Image to a CD, pop it into a laptop or desktop and boot from the CD (I used my HP DV7-7010US for those curious and during the boot process the CD will not touch your existing file system)

Once the Restore CD of NetBSD has finished booting up on your device, turn on the Qube and hold the left and right arrows until it says Net booting

It took a few minutes from this point to the restorecd ready message being displayed on the LCD screen, then hold the select button for two seconds, hit the Enter button twice (once to select the restore option and the second time to confirm the restore)

From here it actually installs NetBSD, some files took longer than others (due to the size more than likely) and for those curious here are the files installed in 5.2.2:
  1. base.tgz
  2. comp.tgz
  3. etc.tgz
  4. man.tgz
  5. misc.tgz
  6. text.tgz
This step of the installation only took a few minutes and when it was completed the LCD updated to indicate success and that it was rebooting:

Gateway rebadged Cobalt Qube2 – NetBSD Installed and Restarting

After this occurred, the first time I installed NetBSD, the LCD appeared stuck on [Starting up]. In going through the Serial Connection log – it appeared my SSD was throwing write errors during installation, I then swapped out the SSD for a 160gb Western Digital SATA drive I had laying around, performed the installation again and had a successful boot from the Qube itself:

Gateway rebadged Cobalt Qube2 – NetBSD Running

The point being – if it hangs, hook up the serial connection upon attempting to reinstall NetBSD.

Post Installation

After unplugging my laptop and hooking the Qube 2 to one of my gigabit switches, I was under the impression Telnet was running and available to connect as root without a password. Unfortunately I was given the following error: [bash] Trying 192.168.1.193... Connected to 192.168.1.193. Escape character is '^]'. telnetd: Authorization failed. Connection closed by foreign host. [/bash] Doing some research, RLOGIN appeared to be the solution to at least get into the device so I could enable SSH, after switching from TELNET to RLOGIN I was in: [bash] Connecting to 192.168.1.193:513... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. login: root Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The NetBSD Foundation, Inc. All rights reserved. Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. NetBSD 5.2.2 (GENERIC) #0: Sat Jan 18 18:11:12 UTC 2014 Welcome to NetBSD! Terminal type is xterm. We recommend creating a non-root account and using su(1) for root access. # [/bash] Immediately I went into my /etc/rc.conf and added sshd=YES, ran /etc/rc.d/sshd start and immediately sshd generated the keys and started itself.

Also something to make you do is set a password for root, which you can do simply by typing in /usr/bin/passwd.

By default SSH will not allow root to connect (for good reasons), so be sure to add another user. You can add another user that has su to root abilities with useradd –m –G wheel johndoe where johndoe is the name of the username you wish to add.

Benchmarking Results

As anyone who has followed my blog for some time, one of the first things I do is port jcBENCH to the platform if it doesn’t already exist. Luckily, NetBSD came with GCC 4.1.1 and BSD derivatives offer a pretty neat C header sysctl.h that provides a lot of the CPU/Architecture information very easily. After implementing the necessary changes and recompiling (wasn’t too slow to compile I have to say), I ran jcBENCH: [bash] $ ./jcBench 100000 1 jcBENCH 0.8.752.0306(mips/NetBSD Edition) (C) 2012-2014 Jarred Capellman CPU Information --------------------- Manufacturer: cobalt Model: Cobalt Qube 2 Count: 1x250mhz Architecture: mipsel --------------------- Running Benchmark.... Integer: 475.185 seconds Floating Point: 2298.39 seconds [/bash] For those who recall I recently upgraded a Silicon Graphics Indy to an R5000 CPU so I was very curious how the Qube running NetBSD would compare to the older Indy. I should note a fair comparison would be to compile jcBENCH on the exact or similar version of GCC in IRIX instead of the version of the 3.4.6 version in nekoware – so take these results with a grain of salt. The results were interesting in that the Floating Point performance was hugely impacted in the Qube (similarly to the R5000SC and R5000PC used in Silicon Graphics machines).

This led me to investigate the exact variants of the RM5XXX CPUs used in the Silicon Graphics O2, Indy and the Cobalt Qube. Low and behold the Qube’s variant runs on a “crippled” 32bit system bus and without any L2 Cache. This got me thinking of any other R5k series Silicon Graphics I had owned – my Silicon Graphics O2 I received February 2012 came to mind, but sadly it had the R5000SC CPU with 512kb of Level 2 Cache. Also unfortunate, I sold that machine off before I had a chance to do an IRIX port of jcBENCH in April 2012.

What’s Next?

The Qube 2 offers a unique opportunity of being a MIPS cpu, extremely low power requirements and virtually silent – leaving me to come up with a 24/7 use for the device. In addition the base NetBSD installation even with 64MB of ram leaves quite a bit left over for additional services: [bash] load averages: 0.02, 0.05, 0.03; up 0+00:28:26 16:30:24 18 processes: 17 sleeping, 1 on CPU CPU states: 0.0% user, 0.0% nice, 0.0% system, 0.0% interrupt, 100% idle Memory: 17M Act, 312K Wired, 5516K Exec, 7616K File, 35M Free Swap: 128M Total, 128M Free PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND 0 root 125 0 0K 2040K schedule 0:09 0.00% 0.00% [system] 628 root 43 0 4572K 1300K CPU 0:00 0.00% 0.00% top 583 root 85 0 16M 3944K netio 0:00 0.00% 0.00% sshd 560 jcapellm 85 0 16M 2916K select 0:00 0.00% 0.00% sshd 462 root 85 0 12M 2304K wait 0:00 0.00% 0.00% login 485 root 85 0 11M 1820K select 0:00 0.00% 0.00% sshd 603 jcapellm 85 0 4280K 1336K wait 0:00 0.00% 0.00% sh 114 root 85 0 3960K 1320K select 0:00 0.00% 0.00% dhclient 420 root 85 0 4552K 1204K kqueue 0:00 0.00% 0.00% inetd 630 root 85 0 3636K 1188K pause 0:00 0.00% 0.00% csh 458 root 85 0 4024K 1168K select 0:00 0.00% 0.00% rlogind 454 root 85 0 3636K 1164K ttyraw 0:00 0.00% 0.00% csh 159 root 85 0 4248K 1100K kqueue 0:00 0.00% 0.00% syslogd 1 root 85 0 4244K 1028K wait 0:00 0.00% 0.00% init 439 root 85 0 3956K 988K nanoslp 0:00 0.00% 0.00% cron 444 root 85 0 4216K 956K ttyraw 0:00 0.00% 0.00% getty 437 root 85 0 4224K 924K nanoslp 0:00 0.00% 0.00% getty 395 root 85 0 3960K 868K select 0:00 0.00% 0.00% paneld [/bash] Thinking back to the device’s original intent and my current interests of mobile device interoperability with “wired” devices, I’ve decided to go back to an idea I had in November 2012 called jcNETMAP. This Windows Phone 8 app’s purpose was to alert you when your set servers went down, utilizing the Scheduled Task feature of the Windows Phone’s API without relying on any other software or device such as GFI Alerts, a custom Windows Service etc.

Taking the idea in a slightly different direction, take the following example of what I imagine is a typical home network:

Maybe add a few tablets, smart phones, consoles, DVRs etc. but the idea being you’re relying on your router’s internal firewall rules to protect your home network. With the advent of DD-WRT among others people might be running a more tuned (albeit all around better version), but still how often can you say you’ve gone into your router and updated the firmware or checked the access logs for anything suspicious? Wouldn’t it be nice if you had some way of knowing traffic funneling from outside to your router could be analyzed like a traditional firewall/packet filter, if anything didn’t look right, send a notification to your smart phone and give you weekly analysis of the “unusual” traffic? I know you could probably setup an open source project to do packet filtering, but would it have the mobile component and run on hardware as low as a Qube 2? And first and foremost – it is simply a learning experience for myself to dive into an area I had never really gotten into previously.

Like many of my ideas – there could be some serious hurdles to overcome. Among others the biggest concern I have is whether or not the Qube 2 would be able to process packets fast enough on my home network to even make this possible – let alone connect into the Web Service which in turn would send the notification to your Windows Phone 8.x device quickly. Regardless of how this project ends up I am sure it will be worth the investment of time, if nothing else I will learn a ton.

In the coming days look for jcBENCH and jcDBENCH MIPS/NetBSD releases. Also I have 2 128MB SIMMS and a 30gb Corsair NOVA SSD coming this week to pop into the Qube 2 - will post any hurdles.

Any general questions about the Qube 2, feel free to comment below and I’ll answer them as soon as I can.

In working on my Silicon Graphics Indy (as detailed in these posts: R5000 upgrade and the initial post), I realized I hadn't built a jcBENCH MIPS3/Irix release before and hadn't released a revamped MIPS4/Irix build on the cross-platform code I worked on a few weeks ago.

Without further adieu:

MIPS3 Release:
jcBench-0.8.751.0208.irix_mips3.cmdl.gz

MIPS4 Release:
jcBench-0.8.751.0208.irix_mips4.cmdl.gz

More to come in the coming days in regards to jcBENCH.
Going back to my initial Silicon Graphics Indy post, I was able to procure an R5000SC 180mhz and the 2 board XZ graphics option (along with a spare chassis/node board). These 2 components coupled with the 256mb of ram and the Maxtor ATLAS 15k II U320 drive I already owned, I have acquired the "ultimate" Silicon Graphics Indy.

The R5000SC 180mhz CPU board: Silicon Graphics Indy R5000SC 180mhz CPU board

XZ Graphics board: Silicon Graphics Indy XZ board

The problem I was not aware of until I was about to swap my older R4400 cpu is that you need a specific PROM version in order to run the newer R4600 and R5000 CPUs. In checking my PROM, I came across one of the original versions (version 4) going back to 1993: Silicon Graphics Indy Old Prom

In order to use a R5000 in an Indy you need version 11, which as it happens I have in the newer node board from 1996: Silicon Graphics Indy New Prom

In the end I swapped out the ram from my R4400 Indy, put a "new" Maxtor Atlas 15k II 73gb Ultra 320 drive in the R5000 chassis and started a fresh install of Irix. One might ask why I didn't just take the drive out of my old system, the answer is that the R4400 is the MIPS3 generation of CPUs and the R5000 and above is MIPS4 generation. As noted in my initial post, by having an R5000 I can make full use of the nekoware archive.

Performance wise how does it compare?
Integer Performance: 596.206 (R4400) 225.467 (R5000)
Floating Point Performance: 797.860 (R4400) 1053.990 (R5000)

Integer performance is considerably faster, about equivalent of my old AMD Phenom II P920 1.6ghz notebook CPU, but floating point (probably due to half the L2 cache of the R4400) is roughly 24% slower. With most gaming/graphics operations being floating point based one could argue depending on the application a R4400 200mhz model might be faster than the R5000 180mhz cpu.

Hoping to wrap up the Windows Store, ARM/Windows Phone 8, SPARC/Solaris 10 and ia64/Linux ports this week, but here is another port: MIPS/Irix:

MIPS/Irix

In case someone missed the other releases:
x86/Mac OS X
x86/Linux
Power PPC/Mac OS X
x86/Windows

In related news, jcBENCH will have it's big official 1.0 release across the same platforms.
Over the Labor Day weekend, I happened to be in Silicon Valley on a short vacation and Fry's Electronics luckily had an Asus X55U Notebook on sale for $258. I had been looking for a long battery life laptop that wouldn't kill me if it ever got hurt during traveling (versus my much more expensive HP laptop). On top of that, I had wanted a Linux laptop to do cross-platform testing of jcDB, jcPIMP and the Mode Xngine. Planning ahead a bit, I brought an older Corsair Force 3 90gb SSD that I was no longer using and a Philips screw driver (yes folks, screw drivers are allowed by the TSA, it just can't be more than a few inches long).

Asus X55U Notebook

Asus X55U Notebook box contents

Asus X55U OpenSUSE Boot Menu

Specifications wise the laptop has:
-15.6" 1366x768 Screen (not the greatest quality, but definitely a lot better than expected at the price point)
-AMD E2-1800 (Dual 1.7ghz APU that clocks itself down to 2x850mhz when performance isn't needed)
-4gb DDR3 1066 (1 slot, upgradeable to 8gb)
-Radeon HD 7340 (DX11, 512mb of system ram is used)
-500gb Hitachi SATA Drive
-1 USB 2.0 and 1 USB 3.0 Port
-HDMI Output
-Gigabit Ethernet
-802.11n WiFi
-VGA Output
-Mic and Headphone Jack
-DVD-RW Drive
-SD/SDXC/SDHC Memory Card Slot

I should note, this APU does support AMD's Virtualization, so you can run Hyper-V, Xen, VMware Workstation etc. on this notebook. Coupled with the 8gb of ram support, this could be a decent portable VM notebook for the price.

Fortunately, doing the swap of the hard drive was extremely easy as opposed to some laptops that require taking apart the entire laptop (looking back at the Dell Inspiron I purchased in October 2010). Just 2 screws to pull off the back, which also contains the single DDR3 SO-DIMM slot.

Asus X55U Notebook (Bottom)

Corsair Force 3 90gb SSD

Curious if the system supported 8gb of DDR3 ram (since the manual didn't specify), I bought an 8gb DDR3-1333 Corsair SO-DIMM:

Corsair 8gb DDR3-1333 SO-DIMM

Swapped out the Hynix 4gb with the Corsair:

Asus X55U with the Corsair 8gb DDR3 SO-DIMM installed

And sure enough, the notebook supports 8gb:

Asus X55U with 8gb showing in the BIOS

While in the BIOS I should mention the charge when off feature this notebook has. Meaning with the lid closed, you can still charge your phone or media player. I wish my HP had that functionality.

Asus X55U BIOS Options

OpenSUSE 12.3 installed without a hitch (even the WiFi worked off the bat). After getting the system configured, the first thought I had was take the recent ia64/Linux port of jcBench and port it over to x86/Linux. On the flight back from SFO, I ported it over and thankfully it was only a re-compile with a slight tweak to the CPU detection.

How does the system perform?
[bash] jcBENCH 0.6.522.0928(x86/Linux Edition) (C) 2012-2013 Jarred Capellman CPU Information --------------------- Manufacturer: AuthenticAMD Model: AMD E2-1800 APU with Radeon(tm) HD Graphics Count: 2x1700.000mhz Architecture: x86/x86-64 --------------------- Running Benchmark.... Integer: 65.4932 seconds Floating Point: 35.6109 seconds [/bash] In comparison to my Silicon Graphics Prism (2x1.5ghz Itanium 2) it performs a little slower in Integer operations, but is nearly 3X faster in Floating Point Operations. In comparison to my HP DV7 laptop (AMD A10), it performs in the same dual threaded applications about 2X as slow, as expected with the slower clock rate and much smaller cache.

Overall, the notebook does exactly what I want and more for a $258 device. Build quality exceeds the Acer netbook and Dell Inspiron I had several years ago, coming close to my HP DV7, if only this Asus used the higher grade plastics. For those curious, battery life is about 4 hours with WiFi enabled the middle of the road screen brightness.
While I haven’t been posting as often as I had been earlier this year I have been hard at work on several projects, with several ending up being dead ends for one reason or another (mostly very low return on investment for the amount of time needed to accomplish them). jcBENCH2 will be released in the next week for Windows 8 and immediately following that I am pleased to announce three interconnected projects that will be taking me through the end of the year – ModeXngine, jcPIMP and Mystic Chronicles.

Mystic Chronicles


Mystic Chronicles

For those that have been following my blog back to 2004, I originally coined Mystic Chronicles that summer and as seen in my original Source Forge project of the Infinity Project I had made it fairly far – definitely farther than I had gotten in the years leading up to that point. The big goal back then for Mystic Chronicles was to provide a semi-online experience, if you were online with your friends playing single player you could join in the same universe akin to Interplay’s Starfleet Command Metaverse concept going back to 2000-2001. The revival of Mystic Chronicles will be my first Windows 8 game and the first powered by the ModeXngine (more details below). The game puts you in charge of a colony with the goal of the game to conquer the other 3 AI players also attempting to rule the galaxy. The game is turn based and has you as the player balancing technological advancements, defensive and offensive strategies.

The longer goal is to turn it into a cross platform HTML5 MVC4 and Windows Phone 8 game supported by ads and offering a premium version with additional features.

Below is an early alpha screenshot of the progress thus far:


I would provide a release date, but taking one from id software, it’ll be released when it’s done.

ModeXngine



Going back to April of this year I debuted the jcGE in my Windows Phone 7/8 game, Cylon Wars. This engine provided a 2D experience with collision detection, animated sprites and trigger based sound effects. While capable, it was definitely not what I wanted in a long term engine that I could readily use on other platforms. Building on the knowledge gained I am pleased to announce, ModeXngine that will initially support both Windows 8 and Windows Phone 8 with an HTML5 component to follow. One of the big elements will be the modularized components all communicating through a “kernel”. Since writing my first game back in 1995, I’ve wanted a framework that could grow with my skills and the technology that surrounds me – I think the time for investment into creating such a framework is now. For those curious, it will coded in C# exclusively. As noted above, this engine will debut with the Windows 8 release of Mystic Chronicles.

jcPIMP


Going back to May, I had soft-launched the jcPICP and started diving down the WCF <-> Java path to promote a truly platform independent platform, however that approach led to quite a few hurdles, namely IRIX’s Java implementation being so old that native soap support wasn’t there. In addition I have begun to switch some of my approaches to WebAPI over WCF in many scenarios where it makes sense. In a messaging environment I feel it does especially since virtually every platform has an HTTP Library no matter the language. That being said, I am renaming the project to jcPIMP, which stands for Jarred Capellman’s Platform Independent Messaging Platform. The main processing server will be an ASP.Net WebAPI 4.5 service with a SQL Server 2012 backend (using Entity Framework 6) with the client being written a cross-platform manner using C++. A recent side project to be discussed later reminded me of the simplicity of C++ and how much I missed using it on a semi-frequent basis.

ModeXngine’s core will be utilizing the message handling components of jcPIMP for both internal and later multiplayer components.

A big question one might ask themselves is, “Why build yet another messaging protocol/platform when there are so many other great solutions out there like RabbitMQ, MSMQ etc?” The main reason – to learn. I am firm believer in that in order to truly understand something you have to create it yourself, learn to overcome the mistakes others have and prevail.

My current plan is to release jcPIMP around Mystic Chronciles to put it in the hands of other developers.
Finally had some time to revisit jcBENCH tonight and found a few issues on the new WPF and Windows Phone 8 releases that I didn't find over the weekend. Unfortunately for the Windows Phone 8 platform, there is a delay between publishing and actually hitting the store. So in the next 24-48 hours, please check out the Windows Phone 8 App Store for the release. You can alternatively just download the current release and await for the Store to indicate there is an update. But for those on Windows, please download the updated release here.
I know I've been more quiet on here than in 2012, but I've been working away on several new Windows Phone 8 apps. One of them was the initial port of jcBENCH to Windows Phone 8. Keeping with the original idea of having the same benchmark on every platform, this continues with the Version 0.7 release. I can now have some sense of approximate performance difference between my Nokia Lumia 920 Windows Phone and my AMD FX-8350 CPU, suffice it to say I am surprised at the speed of the Dual 1.5GHz CPU in my phone. You can get the latest release of jcBENCH for Windows Phone 8 in the app store. If you like or hate, please let me know. I tried to keep a consistent experience between the Win32 GUI version as far as color scheme. [caption id="attachment_1760" align="aligncenter" width="300"]jcBENCH Version 0.7 Release jcBENCH Version 0.7 Release[/caption] As for the Win32 GUI edition, it has been updated to match the new results capturing, you can download it here.
I am proud to announce jcBENCH 0.6.522.1013 for Win32 x86. New in this version is the ability to compare results visually against similar cpus: [caption id="attachment_1516" align="aligncenter" width="300"] jcBENCH 0.6 Compare Results[/caption] In addition, I refactored the code to be a lot cleaner, still have some left to do. Also I made some UI changes to clean it up a bit. The big features left are to provide a more detailed compare feature, OpenCL and of course additional ports to Windows Phone 8 and IRIX. You can get the latest release here.
In working on the new version of jcBench, I made a decision to continue having the actual benchmarking code in C++ (ie unmanaged code) to promote cross-platform deployments. With Windows Phone 8 getting native code support and my obsession with Silicon Graphics IRIX machines I think this is the best route. That being said, the frontends for jcBench will still definitely be done in C# whenever possible. This brings me to my next topic, getting your C++ Library code to be available to your C# application whether that is a console app, WPF, Windows 8 etc. Surprisingly there is a lot of information out there on this, but none of the examples worked for me. With some trial and error I got it working and figured it might help someone out there. So in your C++ (or C) source file: [cpp] extern "C" { __declspec( dllexport ) float runIntegerBenchmark(long numObjects, int numThreads); float runIntegerBenchmark(long numObjects, int numThreads) { CPUBenchmark cpuBenchmark = CPUBenchmark(numObjects, numThreads); return cpuBenchmark.runIntegerBenchmark(); } __declspec( dllexport ) float runFloatingPointBenchmark(long numObjects, int numThreads); float runFloatingPointBenchmark(long numObjects, int numThreads) { CPUBenchmark cpuBenchmark = CPUBenchmark(numObjects, numThreads); return cpuBenchmark.runFloatingPointBenchmark(); } } [/cpp] Notice the __declspec( dllexport ) function declaration, this is key to telling your C# (or any other language) that this function is exposed externally in the DLL. Something else to keep in mind is the difference in types between variables in C++ and C#. A long for instance in C++ is an Int32 in the CLR. Something to keep in mind if you get something like this thrown in your C# application:
This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature
Then in your C# code: [csharp] [DllImport("jcBenchCppLib.dll", CallingConvention = CallingConvention.Cdecl)] public static extern float runIntegerBenchmark(Int32 numObjects, int numThreads); [DllImport("jcBenchCppLib.dll", CallingConvention = CallingConvention.Cdecl)] public static extern float runFloatingPointBenchmark(Int32 numObjects, int numThreads); [/csharp] To execute the function, call it like you would a normal function: [csharp] lblInteger.Content = runIntegerBenchmark(100000, 6) + " seconds"; [/csharp]
Continuing my work on making the new version of jcBench as close to perfect I wanted to handle the lack of an internet connection in pulling the top results down. I had done this in a .NET 4 WinForms app by simply creating a Socket to www.google.com and then attempting to hit my company's server to connect to the SOAP Web Service. With Metro Style applications you don't get access to the System.Net.Sockets namespace. Thus the reason for this post, in hoping to get someone else on the right track. For this example I didn't want to create a full Response Class Object, figuring some people might be satisfied with a simple bool return type (true being can connect to the server, false being not), I met half way with a simple Enumeration: [csharp] enum SOCKET_RESPONSES { No_Internet_Connection, No_Response_From_Server, Successful_Connection } [/csharp] In jcBench, all responses are returned via a class object type of jcBenchResponse. These responses get kicked into a queue like any action or event in the program. A bit more setup time involved in doing it this way, but allows a much greater flexibility when your applications get larger. If anyone were curious, I got the idea from spending more time than I'd like to admit digging through the Quake II and Quake III source code seeing how certain things were designed on such a large scale. A book at some point just digging through the Quake III architecture would be an amazing read. All of the game architecture books I've read, use a simple example, with a couple classes inheriting others, but nothing to the point of showing the bigger picture or even comparing architectures and the pros and cons. In the mean time, the tried and true trial and error method with different application architectures for each project seems to be advancing my knowledge base at a reasonable level.

Function

Here's the actual asynchronous function using the .NET 4.5 keywords async and await. I kept the full namespace reference to avoid the head scratching questions of which namespace the new Metro references are contained in. [csharp] private async System.Threading.Tasks.Task<SOCKET_RESPONSES> checkServer(string hostAddress, int portNumber) { // If no internet connection is found, no reason to continue if (Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile().GetNetworkConnectivityLevel() != NetworkConnectivityLevel.InternetAccess) { return SOCKET_RESPONSES.No_Internet_Connection; } // Open StreamSocket Windows.Networking.Sockets.StreamSocket streamSocket = new Windows.Networking.Sockets.StreamSocket(); try { await streamSocket.ConnectAsync(new Windows.Networking.HostName(hostAddress), portNumber.ToString(), Windows.Networking.Sockets.SocketProtectionLevel.PlainSocket); if (streamSocket != null) { streamSocket.Dispose(); return SOCKET_RESPONSES.Successful_Connection; } return SOCKET_RESPONSES.No_Response_From_Server; } catch (Exception) { // Make sure the socket is diposed of if (streamSocket != null) { streamSocket.Dispose(); } // Assume socket timedout, thus the exception return SOCKET_RESPONSES.No_Response_From_Server; } } [/csharp]

Network Adapter Type Info

I should note, you can get the exact active Internet Network Device Type (Internet Assigned Names Authority Type ID) from this line: [csharp] Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile().NetworkAdapter.IanaInterfaceType [/csharp] So you could do something like this: [csharp] enum DEVICE_TYPE { OTHER = 1, ETHERNET = 6, WIRELESS = 71, FIREWIRE = 144 } // Pre-Condition: There is an active Internet Connection Profile private DEVICE_TYPE getNetworkType() { return (DEVICE_TYPE)Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile().NetworkAdapter.IanaInterfaceType; } [/csharp] The full list of IDs and their associated types is here on MSDN.

Usage

To use the function you could do something like this: [csharp] var response = checkServer("192.168.2.2", 80); await response; if (response.Result != SOCKET_RESPONSES.Successful_Connection) { // Throw some error to the user or simply hide the element that depends on an internet connection } [/csharp] So there you have it, a C# .NET 4.5 Metro way to check a server & port combination that runs asynchronously. Feel free to post feedback as I am sure this is far from the best approach, but it does work.
Below are some interesting results of the floating point performance differences between MIPS and AMD cpus. [caption id="attachment_1105" align="aligncenter" width="300" caption="jcBench Floating Point Performance"][/caption] The biggest thing to note, is the effect Level 2 cache has on Floating Point performance. The 4mb Level 2 cache in the R16000, clearly helps to compensate for the massive difference in clock speed. Nearly a 1 to 1 relationship between a the 6x3.2ghz Phenom II and the 4x800 MIPS R16k. So bottom line, Level 2 cache makes up for megahertz almost by a factor of 4 in these cases. It's a shame the fastest MIPS R16000 only ran at 1ghz and is extremely rare. More benchmarking later this week...
Just finished getting the features for jcBench 0.2 completed. The big addition is the separate test of integer and floating point numbers. The reason for the addition of this test is that I heard years ago that the size of Level 2 cache directly affected performance of Floating Point operations. You would always hear of the RISC cpus having several MegaBytes of cache, while my first 1ghz Athlon (Thunderbird), December 2000 only had 256kb. As I get older, I get more and more scrupulous over things I hear now or had heard in the past thus the need for me to prove to myself one or the other. I'm still working on going back and re-running the floating point tests so that will come later today, but here are the integer performance results. Note the y-axis is the number of seconds taken to complete the test, so lower is better. [caption id="attachment_1097" align="aligncenter" width="300" caption="jcBench 0.2 integer comparison"][/caption] Kind of a wide range of CPUs, ranging from a netbook cpu in the C-50, to a mobile cpu in the P920 to desktops cpus. The differences based on my current findings vary much more greatly with floating point operations. A key things I got from this data:
  1. Single Threaded, across the board was ridiculously slow, even with AMD's Turbo Core technology that ramps up a core or two and slows down the unused cores. Another unsettling fact for developers that continue to not write parallel programs.
  2. The biggest jump was from 1 thread to 2 threads across the board
  3. MIPS R14000A 600mhz CPU is slightly faster than a C-50 in both single and 2 threaded tests. Finally found a very near equal comparison, I'm wondering with the Turbo Core on the C-60 if it brings it inline.
  4. numalink really does scale, even over the now not defined as "fast" numalink 3 connection, scaling it across 2 Origin 300s using all 8 cpus really did increase performance (44 seconds versus 12 seconds).
More to come later today with floating point results...
Just got the initial C port of jcBench completed. Right now there are IRIX 6.5 MIPS IV and Win32 x86 binaries working, I'm hoping to add additional functionality and then merge back in the changes I made to the original 4 platforms. I should note the performance numbers between the 2 will not be comparable. I rewrote the actual benchmarking algorithm to be solely integer based, that's not to say I won't add a floating point, but it made sense after porting the C# code to C. That being said, after finding out a while back on how Task Parallel Library (TPL) really works, my implementation of multi-threading using POSIX, does things a little differently.

Where the TPL starts off with one thread and as it continues processing increases the threads dynamically, my implementation simply takes the number of threads specified via the command line, divides the work (in my case the number of objects) by the number of threads and kicks off the threads from the start. While TPLs implementation is great for work that you don't know if it will really even hit the maximum number of cpus/cores efficiently, for my case it actually hinders performance. I'm now wondering if you can specify from the start how many threads to kick off? If not, Microsoft, maybe add support for that? I've got a couple scenarios I know for instance would benefit from at least 4-8 threads initially, especially for data migration that I prefer to do in C# versus SSIS (call me a control freak).

Back to jcBench, at least with the current algorithm, it appears that a MIPS 600mhz R14000A with 4MB of L2 cache is roughly equivalent to a 1200mhz Phenom II with 512kb L2 cache and 6mb of L3 cache at least in Integer performance. This is based on a couple runs of the new version of jcBench. It'll be interesting to see with numalink if it continues this to 1 to 2 ratio. I'm hoping to see how different generations of AMD cpus compare to the now 10 year old MIPS cpu.
After some additional work getting used to the XAML-ish layout I'm done with the initial jcBENCH Android port. You can download it from here. You will need Android 2.2 or higher for it to run. [caption id="attachment_874" align="aligncenter" width="244" caption="jcBENCH Android"][/caption] I've only tested this on a Dual 1.2ghz HTC Vivid. However, the results were interesting. Comparing single-threaded and multi-threaded operations was curious. Running it in multi-threaded mode was actually 3 times slower. I'm not sure if the way the Task Parallel Library was implemented on Monodroid was done poorly or if there is a bug in the detection for how many cores/cpus there are inside the Mono implementation or not, but something isn't right. Single threaded versus my HTC Titan 1.5ghz SnapDragon it lost out by ~23%. Which makes sense, 300mhz difference or 20% comparing single cores to each other. All that being said I'm content with jcBENCH for the moment until I hear feedback or come up with more features to add.
After some more thought about jcBENCH and what its real purpose was I am going to drop the Solaris and IRIX ports. Solaris has a Mono port, but I only have Sun Blade 100 which has a single cpu. Not expecting a ton of performance from that. IRIX on the other hand, I have a Quad R14k 500 Origin 300, but no port of Mono exists. So I could port it to Java, but then you really couldn't compare benchmarks between the Mono/.NET versions. I am about 50% done with the Android port and am just waiting for the OpenSuse 12.1 compatible MonoDevelop release so I can get started on the Linux Port. After those 2 ports are completed I am thinking of starting something entirely new that I have been thinking about the last couple years. Those that deal with a SQL database and write a data layer for his or her .NET project, know the shortcomings or doing either:
  1. Using an ADO.NET Entity Model, adding your Tables, Views and Stored Procedures and then use that as is or extend it with some business logic
  2. Use an all custom data layer using the base DataTable, DataRows etc, wrap your objects with partial classes and create a "factory"
Both approaches have their pros and cons, the first takes a lot of less time, but you also have a lot less control and could be costly with all of the overhead. Both however will eventually fall apart down the road. The reason, they were built for one audience and one production server or servers. How many times have you gone to your IT Manager and asked for a new Database server because it was quicker then really go back to the architecture of your data layer. As time goes on, this could happen over and over again. I have personally witnessed such an event. A system was designed and built for around 50 internal users, on a single cpu web server and a dual Xeon database server. Over 5 years later, the code has remained the same yet it's been moved to 6 different servers with ever increasing speed. Times have changed and will continue to change, workloads vary from day to day, servers are swapped in and out, so my solution, an adaptive, dynamic data layer. One that profiles itself and uses that data to analyze the server to use either single threaded LINQ queries or PLINQ queries if the added overhead of using PLINQ would out way the time it would take only using one cpu. In addition using Microsoft's AppFabric to cache the commonly used intensive queries that maybe only get run once an hour and the data doesn't change for 24. This doesn't come without a price of course, having only architected this model in my head, I can't say for certain how much overhead the profiling will be. Over the next couple months, I'll be developing this so stay tuned. jcBENCH as you might have guessed was kind of a early test scenario of testing various platforms and how they handled multi-threaded tasks of varying intensity.
After a few days wait, I've ported jcBENCH to Windows Phone 7 (aka WP7 or Windows Phone). I've only tested it on an HTC Titan thus far, but all of the WP7 devices released thus far are all about the same specs wise. Virtually all of them have a 1.4ghz or 1.5ghz SnapDragon CPU, 512mb of RAM and all support 480x800. I wish the Titan would have had one of the Dual Core Qualcomm CPUs, maybe in the Titan III :) [caption id="attachment_860" align="aligncenter" width="480" caption="jcBENCH WP7 Screenshot"][/caption] All you'll need to run it is a developer unlocked phone and then deploy the XAP file as you would normally.
With this new release I've fixed a bunch of things in Web Service and the main library that powers all of the clients. In addition I'm tracking a bit more information like the platform and benchmark version (thinking more down the road when specific versions are going to change in the logic in the actual algorithm). Also this release marks the first release of the GUI Mac OS X 10.6 (and later) client. [caption id="attachment_848" align="aligncenter" width="565" caption="jcBENCH on Mac OS X"][/caption] You'll need GTK 2.12 or newer and Mono 2.10.8 or newer to run it. Being my first Mac OS X application ever outside of iOS development, I can without a doubt say I cannot stand development on anything Apple. KVC has got to be the most bloated way of doing things I have ever seen. I am so glad I do not have to do native Mac OS X applications for a living. That being said though, I think it turned out pretty well in matching the WPF version.
Just benchmarked my netbook, web server, desktop and a few machines at work. Some interesting results, to really take advantage of x number of cores you need operations that are complex and or in a longer duration. Looking at a 24 Core Opteron server run the same number of tasks was actually slightly slower than my 6 core Phenom II. However, running a task that is 10X longer, the 24 core runs 3X faster. Factoring in that the Opteron cores are 900mhz or 29% slower, that's 4X faster, directly equating to the fact the Opteron had 4X as many cores. More details as I benchmark more machines.