latest posts

Silicon Graphics Onyx2


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.


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.


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


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:
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:

int _tmain(int argc, _TCHAR* argv[]) {
     ArduinoInit(); // rest of your program here return 0; }
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 [/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.

A couple updates since my last "what I am doing" update back in July, still been extremely busy with the Baltimore GiveCamp MVC 5 Web Application and work itself. In between everything however, I have a few announcements.

First off, jcBENCH has a new compare results feature on the web site where you can compare up to 3 results with a bar graph. This feature will make it to the Windows Store and Windows Phone 8.1 apps in the coming weeks. In addition a new OpenCL enabled version is near BETA, just have to add error handling and do more testing. The OpenCL client will be released for Linux/x86 and Win32/x86 initially with a MacOSX/x86 release to come later.

A project my wife requested a few weeks ago is in the Windows Phone Store: jcTRENDNET. This application allows you to remotely view and manage Trendnet IP 751 WIC/WC cameras. More features to come, but a pretty feature filled 1.0 release.

The larger project I mentioned in my July update, is still being worked on. I ran into some huge technical hurdles, that while not impossible will require some extensive work to even get cranking with something of substance. My latest work has been leading me to design my own language to be interfaced with C++, but I'm still working out the short and long term goals.

Lastly, for the last week or two I've been attempting to get back into game development. After a good start last August, I lost momentum after 2 weeks or so for two reasons: last of mapping out what the game would be and other projects. This new idea is modular in the regards that the base game isn't terribly complex, but future features can be added on to enhance the game. At least initially it will only be a Windows Phone 8.1 game, but more than likely a Windows Store 8.1 game as well. I have yet to find a game that can captivate my time on my Lumia 1520 so this should solve it. More details to come with a release when it's done to quote id software.

Just a quick update, I just wrapped up the 0.9.850.0531 release of jcBENCH for Mac OS X/x86. Previously there was a much older port going back to January 2012, so it is nice to finally have it running on the same codebase as the other platforms now. So please if you've got an Apple product, please go run jcBENCH as I only have an older iMac to compare results with.

On a somewhat funny note the iMac I do all my Xamarin work on is several factors slower than my $60 AMD Athlon 5350 I use in my firewall - funny how technology catches up at a fraction of the cost.
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:

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

First off, things have been a bit hectic since my last posting (sadly almost a month ago). I’ve been doing extensive volunteer work for an all new custom ASP.NET MVC 5 web application for the Baltimore GiveCamp to the point it’s become a second job (for better or for worse).

In between that work and my day job, I managed to get jcBENCH its own domain along with an all new MVC/WebAPI site hosted on Azure. Newly available is a Windows Store port along with an updated Android port (the last update to the Android port was 2.5 years ago – good to get that done). Big changes in the 0.9 release is the ability to upload your results across every platform along with a new scoring system to better show performance across all devices. Every platform but IRIX/MIPS3 and MacOSX/x86 ports have been updated (hoping to get these done sometime this week). More to come on that front in regards on the web site in regards to graphs and comparisons (along with some responsive UI fixes on lower resolution displays). As of right now every current major platform outside of iOS and Blackberry have ports. If someone wishes to waive the iOS Store fee and Xamarin Framework license fee, I would be happy to do the iOS port. For a free app, I just can’t justify the cost.

In addition a project I’ve resurrected from July/August 2008, I finally figured out how to actually implement it (it wasn’t a focus of my time for sure – I can only remember one instance since where I actually opened Visual Studio to work on it). Technology has definitely advanced far beyond where it was then and I’ve added several extremely neat features (at least to me) purely from how far I’ve come as a programmer in the 6 years since. My goal is to have an alpha released sometime in August. What is neat, is that no one else (to my knowledge) has done anything of this scope or functionality – nor to this scale, especially by a single developer.

Along with this project, two smaller libraries will also be released freely with the hope of some adoption, but at the end of the day I am making them to assist myself in all future projects (creating a jcPLATFORM for lack of a better name). If no one else uses them, there will be no sorrow on my part.

More to come in the days ahead – two long blog posts and the remaining two ports of jcBENCH in particular.
After spending the weekend publishing jcBENCH to both the Windows Store and Windows Phone I figured I would post some notes/findings.

My first impressions of a Universal Windows Applications is mixed. On one hand I found the starting templates extremely well thought out, especially if someone who hadn't been exposed to MVVM prior. In addition I liked the idea that all but my View could be shared being that the Windows Phone 8.1 app is not the Silverlight 8.1 project type. This came with its own negatives however as you lose access to DeviceStatus, which as of the time of this writing is not available in Windows Runtime applications. I should note my scenario with jcBENCH is kind of unique, it requires the ability to query the device pretty extensively to get the number of cores, cpu model, speed and architecture on each. For a typical scenario you wouldn't need this level of detail.

Going forward I think I might simply keep with my MVVM Cross methodology to create Android and iOS applications with Xamarin for work projects, especially considering Windows Store and Windows Phone are unfortunately not the top requested platforms for clients of my employer. For personal projects I will keep building Universal Windows Applications however, as both of those platforms I enjoy far more than iOS and Android (even with Xamarin).

In regards to getting access to the QueryPerformanceFrequency, QueryPerformanceCounter and GetNativeSystemInfo inside the Shared project you'll need to do the following:
#if WINDOWS_APP [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)] private static extern bool QueryPerformanceFrequency(out long lpFrequency); [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)] internal static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo); [DllImport("kernel32.dll")] private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); #endif #if WINDOWS_PHONE_APP [DllImport("api-ms-win-core-profile-l1-1-0.dll", SetLastError = true, CharSet = CharSet.Ansi)] private static extern bool QueryPerformanceFrequency(out long lpFrequency); [DllImport("api-ms-win-core-sysinfo-l1-2-0.dll", SetLastError = true, CharSet = CharSet.Ansi)] internal static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo); [DllImport("api-ms-win-core-profile-l1-1-0.dll")] private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); #endif ]]>
More to come on Universal Windows Applications and some big jcBENCH announcements coming later this week.

Another day, another updated port of jcBENCH, this time for x86/Linux. There are no dependencies, just execute and run.

You can download the x86-linux-0.8.755.0507 release here.

[bash] jcBENCH 0.8.755.0507(x86/Linux Edition) (C) 2012-2014 Jarred Capellman CPU Information --------------------- Manufacturer: AuthenticAMD Model: AMD Phenom(tm) II X2 545 Processor Count: 2x2999.977mhz Architecture: x86 --------------------- Running Benchmark.... Integer: 15.8167 seconds Floating Point: 22.9469 seconds [/bash] To recap the following ports are still needing to be updated:
-x86/MacOS X
-arm/Windows Phone 8
-Windows Store

Hoping to get more of these ports knocked out in the coming days so as always check back here. In addition I'm hoping to get an official page up and running with all of the release conveniently located instead of the current situation. No eta on that project however.
I'm pleased to announce the first release of the x86/FreeBSD port of jcBENCH. A few notes on this port, that I thought would be interesting:

1. At least with FreeBSD 10.0, you need to use clang++ instead of g++.
2. With FreeBSD in Hyper-V I needed to switch to utilizing the Legacy Network Adapter.

You can download the 0.8.755.0504 release here.
[bash] jcBENCH 0.8.755.0505(x86/FreeBSD Edition) (C) 2012-2014 Jarred Capellman CPU Information --------------------- Manufacturer: AuthenticAMD Model: AMD Phenom(tm) II X2 545 Processor Count: 2x1517mhz Architecture: amd64 --------------------- Running Benchmark.... Integer: 14.877 seconds Floating Point: 17.5544 seconds [/bash] I'm hoping to have the x86-Linux release later this week.
Going back to a post from a few weeks back, I'm proud to say all of the ppc/MacOS X code has been upgraded to the big 0.8 release a few months back.

You can download the 0.8.755.0504 release here.

For those curious on the latest code here at the results from Power Mac G5: [bash] jcBENCH 0.8.755.0504(ppc/MacOS X Edition) (C) 2012-2014 Jarred Capellman CPU Information --------------------- Manufacturer: Apple Model: PowerPC G5 (1.1) Count: 2x2 GHz Architecture: ppc --------------------- Running Benchmark.... Integer: 62.7726 seconds Floating Point: 142.774 seconds [/bash] In comparison a somewhat recent AMD E-350 D (Dual 1.6ghz APU) gets roughly the same numbers. To be fair, for an October 2005 G5 compared to a low end January 2011 processor it didn't do as bad as I would have thought. What is even more surprisingly, comparing the G5 to my HP DV7-7010us, the G5 is actually slightly faster in 2 threaded floating point tasks (probably the cache), 171.996 seconds. However in integer, my HP is considerably faster, 17.61328 seconds.

An updated version for x86/MacOS X should be available later this week as well as a x86/Linux release - stay tuned.

In working on the ia64/Win32 port a few weeks ago, I realized I hadn't completed the CPU Detection nor released an x86/Win32 client in over a year. New since the last release is the complete cpu detection and now uses the common code base across all of the platforms. Result uploading will be coming in the big 0.9 release (hoping for next month).

In general though, I hope to add more platforms to my ever expanding list and offer a quick way to download the client for the platform you wish to test. The existing jcBENCH page was a carry over from the WordPress page I created a very long time ago now - look for that also to coincide with the 0.9 release.

In general I have current native ports for the following platforms:

And older (need to recompile and update) the following:
-ppc/MacOS X
-x86/MacOS X
-arm/Windows Phone 8

With ia64/Win32 and alpha/Win32 releases coming this month - just waiting on obtaining VC++ 6.0 for Alpha and some quirks in ia64/Win32 CPU Detection.

I'm looking to add x86/FreeBSD and Windows Store to the list sooner than later.

For those looking for the x86/Win32 release click here.

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 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 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


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).


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 Connected to 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 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:

MIPS4 Release:

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:


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

In related news, jcBENCH will have it's big official 1.0 release across the same platforms.
As noted in my Asus X55U Notebook write up earlier today, I ported over jcBENCH to x86/Linux. Luckily, there were only minute changes required from the ia64/Linux port. Interesting the /proc/cpuinfo is handled differently between SLES 9 and OpenSUSE 12.3. I'll have to do further investigation on the reasoning behind that.

You can grab the x86/Linux 0.6.522 release of jcBENCH here.
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.
After getting my Silicon Graphics Prism ready to go on Saturday, and then getting the Intel C++ Compiler up and running on Sunday, my first task: getting jcBENCH ported over.

Not having done Linux development in a while (IRIX is similar, but different), I had to go through a few hurdles. One of which being, remembering the compiler macro for detecting Linux versus Win32 and IRIX. Luckily Sourceforge has a great listing of all the macros. After pushing through a few timespec_t issues (Linux's version is timespec), I was able to get it ported over while leaving in my #ifdef to retain portability.

A couple notes for me to remember and in case some else has the same issues:
*To fix the "undefined reference to 'clock_gettime' and 'clock_settime'"
-include "-l rt" to your g++ argument list

So how does my Dual Intel Itanium 2 1.3ghz/3mb L3 Cache do?

[shell] jcBENCH 0.6.522.0826(ia64/Linux Edition) (C) 2012-2013 Jarred Capellman CPU Information --------------------- Manufacturer: GenuineIntel Model: Itanium 2 Count: 2x1300.000000mhz Architecture: IA-64 --------------------- Running Benchmark.... Integer: 63.0576 seconds Floating Point: 119.499 seconds [/shell] In comparison to my other machines, Integer performance with both CPUs is some where between a single CPU of an A6-3500 (3x2.1ghz) and an A10-4600M (4x2.3ghz).

In comparison, Floating Pointing performance with both CPUs faired much better in that it was some where between my old Phenom II X2 545 (2x3ghz) and an A6-3500 (3x2.1ghz).

You can download the initial ia64/linux release here.

What's next? Now that I have some baseline metrics, tomorrow night I will swap in the spare 1.6ghz/9mb L2 Cache Itanium 2 CPUs I purchased a while back for my Silicon Graphics Altix 350 systems. Stay tuned for more details.
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.


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.


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.
After a few days of development, jcBENCH2 is moving along nicely. Features completed:

1. WebAPI and SQL Server Backend for CRUD Operations of Results
2. Base UI for the Windows Store App is completed
3. New Time Based CPU Benchmark inside a PCL
4. Bing Maps Integration for viewing the top 20 results

Screenshot of the app as of tonight:
jcBENCH2 Day 4

What's left?

7/17/2013 - Social Networking to share results
7/18/2013 - Integrate into the other #dev777 projects
7/19/2013 - Bug fixes, polish and publish

More details of the development process after the development is complete - I would rather focus on the actual development of the app currently.
Starting a new, old project this weekend as part of the #dev777 project, jcBENCH 2. The idea being, 7 developers, develop 7 apps and have them all communicate with each other on various platforms.

Those that have been following my blog for a while, might know I have a little program I originally wrote January 2012 as part of my trip down the Task Parallel Library in C# called, jcBENCH. Originally I created Mac OS X, IRIX (in C++), Win32 and Windows Phone 7 ports. This year I created a Windows Phone 8 app and a revamped WPF port utilizing a completely new backend.

So why revisit the project? The biggest reason: never being 100% satisfied because of my skill set constantly being expanded I find myself always wanting to go back and make use of a new technology even if the end user sees no benefit. It's the principle - never let your code rot.

So what is Version 2 going to entail? Or better put, what are some of the issues in the jcBENCH 1.x codebase?

Issues in the 1.x Codebase

Issue 1

As it stands today all of the ports have different code bases. In IRIX's case this was a necessity since Mono hasn't been ported to IRIX (yet). With the advent of PCL (Portable Class Libraries) I can now keep one code base for all but the IRIX port, leaving only the UI and other platform specific APIs in the respective ports.

Issue 2

On quad core machines or faster the existing benchmark completes in a fraction of the time. This poses two big problems - doesn't represent a real test of performance over a few second span (meaning all of the CPUs may not have enough time to be tasked before completion) and on the flip side those devices that are much slower (like a cell-phone) it could take several minutes. Solution? Implement a 16 second time benchmark and then calculate the performance based on how many objects were processed during tha time.

Issue 3

When testing multi-processor performance, it was cumbersome to test all of the various scenarios. For instance if you had an 8 core CPU as I do with my AMD FX-8350, I had to select 1 CPU, run the benchmark and then record the result, select 2 CPUs and repeat so on and so forth. This took a long time when in reality it would make sense to offer the ability to either run the benchmark on using all cores by default and then via an advanced option allow the end user to select a specific test or have it do the entire test automatically.

Issue 4

No easy way to share the results exists across the board in the current version. In recent versions I added a centralized result database and charting so no matter the device you could see how your device compared, but there was no easy to get a screenshot of the benchmark, send the results via email or post on a social network. Where is the fun in a benchmark if you can't brag about it easily? In Version 2 I plan to focus on this aspect.

Proposed Features for Version 2

1. Rewritten from the ground up utilizing the latest approaches to cross-platform development I have learned since jcBENCH's original release 1/2012. This includes the extensive use of MVVMCross and Portable Class Libraries to cut down on the code duplication among ports.

2. Sharing functionality via Email and Social Networking (Twitter and Facebook) will be provided, in addition a new Bing Map will visually reflect the top performing devices across the globe (if the result is submitted with location access allowed)

3. Using WebAPI (JSON) instead of WCF XML backend for result submission and retrieval. For this app since there is no backend processing between servers, WebAPI makes a lot more sense.

4. New Timed Based Benchmark as opposed to time to process X amount of tasks

5. Offer an "advanced" mode to allow the entire test suite to be performed or individual tests (by default it will now use all of the cores available)

6. At launch only a Windows Store app will be available, but Windows Phone 7/8 and Mac OS X ports will be released later this month.

Future Features

Ability to benchmark GPUs is something I have been attempting to get working across platforms and for those that remember I had a special Alpha release last Fall using OpenCL. Once the bugs and features for Version 2 are completed I will shift focus to making this feature a reality.

Implement all of this functionality in a upgraded IRIX port and finally create a Linux port (using Mono). One of the biggest hurdles I was having with keeping the IRIX version up to date was the SOAP C++ Libraries not being anywhere near the ease of user a Visual Studio/C# environment offers. By switching over to HTTP/JSON I'm hoping to be able to parse and submit data much easier.

Next Steps

Given that the project is an app in 7 days, today marks the first day of development. As with any project, the first step was getting a basic feature set as mentioned above and now to create a project timeline based on that functional specification.

As with my WordPress to MVC Project in April, this will entail daily blog posts with my progress.

Day 1 (7/13/2013) - Create the new SQL Server Database Schema and WebAPI Backend
Day 2 (7/14/2013) - Create all of the base UI Elements of the Windows Store App
Day 3 (7/15/2013) - Create the PCL that contains the new Benchmark Algorithms
Day 4 (7/16/2013) - Integrate Bing Maps for the location based view
Day 5 (7/17/2013) - Add Social Networking and Email Sharing Options
Day 6 (7/18/2013) - Integrate with fellow #dev777 projects
Day 7 (7/19/2013) - Bug fixing, polish and Windows Store Submission

So stay tuned for an update later today with my the successes and implementation of the new SQL Server Database Schema and WebAPI Backend
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.
While not completely done with the IRIX 0.3 to 0.6 upgrade, I figured it would be good to get the updated client out. New in this version over the previous is the ability to parse the available hardware and the big news...all C++ code in the IRIX, Linux and Windows clients share common code. [bash] jcBENCH 0.6.522.1025(IRIX Edition) (C) 2012 Jarred Capellman CPU Information --------------------- Manufacturer: MIPS Model: R14000 Count: 4x600mhz Architecture: MIPS --------------------- Running Benchmark.... Integer: 1.61358 seconds Floating Point: 1.57094 seconds [/bash] While yes there are a few: [cpp] #if defined(WIN32) [/cpp] It is nice now to have a common code base. Going forward, I still have to create the Qt and figure out the finer points of using SOAP/WCF Services in a C++ client in a portable manner. You can download this new release 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.
After a considerably longer than expected development time, the big new 0.5 release of jcBENCH is finally available. You can download it from here. [caption id="attachment_1510" align="aligncenter" width="300"] jcBENCH WPF 0.5 Release[/caption] With this new release is an all new WPF GUI and a new C++ Library to help facilitate cross-platform development. The idea being, use the same C++ code across all platforms and to just develop a frontend for each. Also new is a built in viewer of the Top 10 Results and the return of the ability to submit results. Some future enhancements down the road:
  1. OpenCL Benchmark, with my restructuring I have to re-code my C# OpenCL code -> C++ OpenCL code and then add support to the app to determine if OpenCL drivers exist
  2. More comprehensive comparing of results, filtering down to similar spec machines, comparing CPUs used, Manufacturer etc
  3. Ability to run the whole test suite at once (ie if you have a 6 CPU, benchmark it with each CPU used
  4. IRIX 6.5 and Windows Phone 8 clients
If you have suggestions/requests, please let me know, I'm definitely interested in hearing what people have to say.
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:
[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); ]]>
To execute the function, call it like you would a normal function:
lblInteger.Content = runIntegerBenchmark(100000, 6) + " seconds"; ]]>
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 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:
     No_Internet_Connection, No_Response_From_Server, Successful_Connection }
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.


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.
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; }

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:
Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile().NetworkAdapter.IanaInterfaceType ]]>
So you could do something like this:
     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; }
The full list of IDs and their associated types is here on MSDN.


To use the function you could do something like this:
var response = checkServer("", 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 }
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.
A bit more digging around, found a forum post on guru3d, not sure why I didn't remember to check their first, but there are Catalyst Drivers dated June 12th on there for Windows 7 and 8 that work on the 7660G and probably the other Trinity based APUs. For those interested go here. Using the latest build of jcBENCH, pulled it right up: [caption id="attachment_1263" align="aligncenter" width="300" caption="jcBench showing 7660G (Devastator) as an OpenCL device"][/caption] Gotta love AMD's codenames: Devastator Now onto benchmarking this thing...
Got some more results add to the comparison: [caption id="attachment_1218" align="aligncenter" width="300" caption="jcBench Expanded Integer Results - 5/15/2012"][/caption] [caption id="attachment_1219" align="aligncenter" width="300" caption="jcBench Expanded Floating Point Results - 5/15/2012"][/caption] Tonight I am hoping to add a quick comparison page so anyone could ask, well how does a Dual 600mhz Octane perform against a 600mhz O2?
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...
I was able to add several more machines to the comparison with the help of a friend over at Nekochan. [caption id="attachment_1102" align="aligncenter" width="300" caption="jcBench Integer Comparison 2"][/caption] Very interesting how MIPS scales and how much of a difference 100mhz and double the Level 2 cache makes an effect on speed.
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.
New version of jcBENCH will be coming out tonight, in the mean time I have taken down the web service so you won't be able to submit results. More details to follow...
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.