March Madness Multicore Style

Filed Under (Development, HPC, Parallel / Distributed) by Robert Green on 04-03-2010

An interesting article has been posted over at Linux Magazine. The article interests me mainly because it gets to the heart of an issue that I myself ponder over: As hardware overtakes software, how will software catch up? This is a very important question, especially in the HPC world as there is no single language that elegantly translates across multiple architectures.


Read the rest of the article here.

Central Force Optimization

Filed Under (Central Force Optimization, Optimization, Research) by Robert Green on 03-03-2010

Central Force Optimization (CFO) is a new and interesting optimization method that has been developed by Richard A. Formato. The most interesting aspect of CFO is that it is fully deterministic unlike PSO, GA, AIS, or any of the other PIS based techniques.

The papers that he has produced on the topic can be found at:

  1. Are Near Earth Objects the Key to Optimization Theory?
  2. Central Force Optimization: A New Metaheuristic with Applications in Applied Electromagnetics
  3. Central Force Optimization: A New Nature Inspired Computational Framework for Multidimensional Search and Optimization
  4. Central Force Optimization: A New Deterministic Gradient -like Optimization  Metaheuristic
  5. Comparative Results: Group Search Optimizer and Central Force Optimization
  6. Pseudorandomness in Central Force Optimization
  7. Central Force Optimization Applied to the PBM Suite of Antenna Benchmarks

And, for all of those interested, click here to download my C++ implementation.

The Parallel Power Law

Filed Under (Parallel / Distributed) by Robert Green on 23-02-2010

This article is very interesting. A very hot topic in parallel computing these days is power consumption and this is the first that I’ve heard of the parallel power law. I’m intrigued.

Particle Swarm Optimization

Filed Under (Development, Heuristics, Optimization, Research) by Robert Green on 01-02-2010

In pursuing some of my research as of late, I needed to use Particle Swarm Optimization. All I wanted was some simple code for both Real and Binary PSO – but I couldn’t find anything I like! So, I’m providing a file containing both along with the RNG that I used. Please be aware that this code has not been refined. It’s clear, but rather ugly.

Particle Swarm Optimization Code

Mersenne Twister

So Where Have I Been?

Filed Under (Research) by Robert Green on 05-01-2010

To my very own surprise I have not written a post since November! How crazy is that! The main reason of this has been the utter business of pursuing my PhD. What a crazy semester it was! So what have I accomplished in this first semester? It can be divided into 3 sections: Classes, Projects, and Papers.

As for classes, I completed two: Artificial Intelligence and The Smart Grid. Both were highly interesting courses and the hard work paid off as well – I received an A- and an A in the courses! The Artificial Intelligence course was very interesting and covered a vast amount of AI topics. The class was taught by Dr. Gursel Serpen. The Smart Grid class was taught by my own advisor, Dr. Lingfeng Wang, and was a very solid and thorough introduction to alternative energy systems and the smart grid.

Projects and Papers have a bit of an overlap. I have posted my AI paper here – “Survey of the Applications of Arti cial Intelligence Techniques to the Sudoku Puzzle” – but I will not be posting my other 3 papers until I am aware of their submission status.

Through the entire semester I learned a lot. During the coming semester I will be working with biologically inspired computing techniques, optimization, the smart grid, and high performance computing. I’ll keep you all updated!

A New Start

Filed Under (Education, General) by Robert Green on 11-08-2009

Tagged Under : , , ,

So it’s been quite a while since I’ve last posted. That’s happened for really one big reason: I got married! So, as of August 1, I am a married man and I am wed to a wonderful woman. Now that all that planning and such is complete and we’re back from the honeymoon I plan to post a bit more often.


On a more professional note, at the end of this month I will be starting my PhD studies at the University of Toledo under Dr. Lingfeng Wang. My area of research will be modeling and simulation concerning the reliability of large fleets of PHEVs (Plug In Hybrid Electric Vehicles) on the new Smart Grid. I plan to update this site often with my research and progress.

Intel Threading Challenge #1

Filed Under (Development, Parallel / Distributed) by Robert Green on 10-07-2009

Tagged Under : , , , , ,

While I never participated in the Intel Threading Challenge, I still find the problems really intriguing. Why? Because they are problems designed to test threaded development which is not only cool but is also going to play a large part in the future of computing. I would call all this problem for the most part concurrent, not parallel. Why? Read this and you’ll understand completely. Now, on to the challenge!

Problem # 1 states:

Problem description: Given a set of unsorted items with keys that can be considered as a binary representation of an integer, the bits within the key can be used to sort the set of items. This method of sorting is known as Radix Sort.

Write a program that includes a threaded version of a Radix Sort algorithm that sorts the keys read from an input file, then output the sorted keys to another file. The input and output file names shall be the first and second arguments on the command line of the application execution.

The first line of the input text file is the total number of keys (N) to be sorted; this is followed by N keys, one per line, in the file.  A key will be a seven-character string made up of printable characters not including the space character (ASCII 0×20). The number of keys within the file is less than 2^31 – 1.  Sorted output must be stored in a text file, one key per line.

Timing: If you put timing code into your application to time the sorting process and report the elapsed time, this time will be used for scoring.  If no timing code is added, the entire execution time (including time for input and output) will be used for scoring.


Example Input file:
8
H@skell
surVEYs
sysTEMS
HASKELL
Surveys
1234567
SURveys
systEMS

Example Output file:
1234567
H@skell
HASKELL
SURveys
Surveys
surVEYs
sysTEMS
systEMS

My solution (both serial and parallel):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Diagnostics;
using System.Threading;
using System.IO;
 
namespace RadixSort {
 
    class Program {
        static void Main(string[] args) {
            StreamReader sr;
            int length;
            TimeSpan serial, parallel;
            sr = File.OpenText(@"C:\Documents and Settings\rgreen\Desktop\Threading\Threading\rsTestK100.dat");
 
            length = Convert.ToInt32(sr.ReadLine().Trim());
            string[] values = new string[length];
            string[] newValues = new string[length];
            for(int x = 0; x < length; x++) {
                values[x] = sr.ReadLine().Trim();
            }
 
            Stopwatch sw = new Stopwatch();
 
            //
            // Serial
            //
            sw.Start();
            RadixSort(values).CopyTo(newValues, 0);
            sw.Stop();
            serial = sw.Elapsed;
 
            //
            // Parallel
            //
            sw.Reset();
            sw.Start();
            ParallelRadixSort(values).CopyTo(newValues, 0);
            sw.Stop();
            parallel = sw.Elapsed;
 
 
            Console.WriteLine("Serial Time: " + serial);
            Console.WriteLine("Parallel Time: " + parallel);
            Console.ReadLine();
        }
 
        public static string[] ParallelRadixSort(string[] array) {
            int length = array.Length;
 
            Parallel.For(0, array[0].Length - 1, delegate(int curRadix) {
                int index = array[0].Length - 1 - curRadix;
                array = new MergeSort(array, array[0].Length - 1 - index).Results;
            });
 
            return array;
        }
 
        public static string[] RadixSort(string[] array) {
 
            int length = array.Length;
 
            for(int curRadix = array[0].Length - 1; curRadix >= 0; curRadix--) {
                array = new MergeSort(array, array[0].Length - 1 - curRadix).Results;
            }
 
            return array;
        }
    }
}

And there you have it!

Toughest Developer Puzzle Ever

Filed Under (.NET, Development, Web Development) by Robert Green on 02-07-2009

Tagged Under :

Jeff Blankenburg has put together an incredible puzzle over at http://www.toughestdeveloperpuzzleever.com/tdpe/. Absolutely a ton of fun. It took me a few hours to get through it myself!

Project Euler #6

Filed Under (Development, Parallel / Distributed) by Robert Green on 01-07-2009

Tagged Under : , ,

Project Euler problem #6 is

Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.

When I first began looking at this problem I wanted to experiment a bit with the Parallel Extensions for .NET, so I started where any parallel algorithm begins: with a sequential algorithm. The algorithm here is rather trivial: Loop over the natural numbers from 1 to 100. In order to sum the squares I will sum the square of each number. In order to square the sum I will sum the numbers and then square them. The difference is the answer. So, first, I came up with two functions: SumOfSquares and SquareOfSums.


My first attempt at these functions ended up something like this:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
static double SumOfSquares(int min, int max) {
    double result = 0;
    for(int x = min; x <= max; x++) {
        result += Math.Pow(x, 2);
     }
     return result;
}
static double SquareOfSums(int min, int max) {
    double result = 0;
    for(int x = min; x <= max; x++) {
        result += x;
    }
    return Math.Pow(result, 2);
}

Both of those functions are very straight forward. My first thought after writing these was, “Hey, why not use some LINQ?” So I did. Here is how the functions change:


1
2
3
4
5
6
static double LinqSumOfSquares(int min, int max) {
    return Enumerable.Range(min, max).Select(d => Math.Pow(d, 2)).Sum();           
}
static double LinqSquareOfSums(int min, int max) {
    return Math.Pow(Enumerable.Range(min, max).Select(d => d).Sum(), 2);    
}

Wow! Talk about incredible, shrinking functions! I love finding a way to make code more succinct, readable, and elegant and these changes seem to have hit the nail on the head! Anyways, that is basically all the pieces for the sequential algorithm. All you have to do is call each of those functions and take the difference. Simple, huh? But the real question is how can we parallelize these bad boys? I have a few thoughts.

  1. Call each function in parallel. In other words let the sumOfSquares and SquareOfSum function run at the same time in different threads.
  2. Parallelize each function invidvidually. In other words leverage the loops inside of each function in order to parallelize them.

So let’s take a look at each method using the Parallel Extensions for .NET. The first method is calling each function in parallel. My first thought here was to use Parallel.Invoke in order to call each function at the same time. A little further research quickly revealed that Parallel.Invoke cannot return any values. My initial response to that: “Well that sucks.” Luckily there’s another class in the Parallel library called Futures. What’s a future? From DevX

“In TPL terms, a Future is basically a task that returns a value. It’s like a deferred function. You start it running and then use its value later. If the Future hasn’t finished calculating its value by the time you need it, it makes you wait while it finishes.”

Sounds good to me. So how do we use futures? Like this:


1
2
3
4
5
6
7
8
static long Problem6Futures(int min, int max) {
 
    Future<double> fSumOfSquares = Future.Create(() => SumOfSquares(min, max));
    Future<double> fSquareOfSums = Future.Create(() => SquareOfSums(min, max));
    double result = fSquareOfSums.Value - fSumOfSquares.Value;
 
    return result;
}

Easy, huh? All you have to remember is that Futures are deferred functions that return values. The result of Future operation gets stored in an object of type Future and the value is stored in Object.Value. So how about the second method of parallelizing this algorithm? Well, it’s even easier because of PLINQ – or Parallel LINQ. Let’s see what it looks like.


1
2
3
4
5
6
static double ParallelSumOfSquares(int min, int max) {
    return Enumerable.Range(min, max).AsParallel().Select(d => Math.Pow(d, 2)).Sum();
}
static double ParallelSquareOfSums(int min, int max) {
    return Math.Pow(Enumerable.Range(min, max).AsParallel().Sum(), 2);
}

Hah! Even easier! All that I did was add .AsParrallel() to our data. That tells LINQ to do the processing in parallel!

So, there’s Project Euler Problem #6 for you. Was it a hard problem? Not really. Are you going to see major performance results through the parallelization of this algorithm? No. But you gotta’ start somewhere when you’re learning how to parallelize algorithms using a new library. Today I used Futures and PLINQ and that sound’s like a pretty solid start to me.

Project Euler #3

Filed Under (Development, Parallel / Distributed) by Robert Green on 30-06-2009

Tagged Under : ,

Project Euler #3 is :

Find the largest prime factor of a composite number.

My first attempt at this whipped up some typical code that simply brute forced my way to the solution. My code looked like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
static void Problem3() {
    long n = 600851475143;
    int factor = 2;
    int lastFactor = 1;
 
 
    if(n % 2 == 0) {
        lastFactor = 2;
        n = n / 2;
        while(n % 2 == 0) {
            n = n / 2;
        }
     } else {
         lastFactor = 1;
     }
     factor = 3;
 
     double maxFactor = Math.Sqrt(n);
     while(n > 1 && factor <= maxFactor) {
          if(n % factor == 0) {
              n = n / factor;
              lastFactor = factor;
              while(n % factor == 0) {
                  n = n / factor;
              }
              maxFactor = Math.Sqrt(n);
          }
          factor += 2;
      }
 
      if(n == 1) {
          Console.Write(lastFactor.ToString() + " ");
      } else {
          Console.Write(n.ToString() + " ");
      }
}



Not very elegant, but it works. So I set out to find something a bit prettier and I came across I LINQ solution here. All I did was tack on the .AsParallel() in order to give it a little speed boost. The code looks like:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
static void LinqProblem3() {
    long largeNumber = 600851475143;
    var allPrimeFactors = from p in Primes.PrimeFactors(largeNumber).AsParallel()
                                 orderby p descending
                                 select p;
 
    foreach(var f in allPrimeFactors){
        Console.WriteLine(f);
    }
}
 
public static class Primes {
 
    // Find all prime factors.
    public static IEnumerable<int> PrimeFactors(long number) {
        // Start by removing the lowest prime (2)
        return MorePrimeFactors(number, 2);
    }
 
    // This recursive method finds all prime factors.
    private static IEnumerable<int> MorePrimeFactors(long number, int factor) {
        // Find the next prime factor
	while(number % factor != 0)
	    factor++;
	// Return it.
	yield return factor;
 
	// look again...
	if(number > factor)
		// recursively look for this factor again, using Num/factor
		// as the new big number
		foreach(int factors in MorePrimeFactors(number / factor, factor))
			yield return factors;
	}
}