Add this blog to Del.icio.us, Digg or Furl | Create Watchlist for this blog

Archive for August, 2007

Intel C++ 10, OpenMP & OpenSuSE Linux

Friday, August 31st, 2007

OpenMP on Linux with Intel iccAs promised yesterday, I’ll try the OpenMP features of Intel C++ 10.0 for Linux today. Cause I’m lazy, I use a wide spread “Hello World” for OpenMP example, it is very simple and it’s only purpose is to demonstrate the basics of how to parallelize a code with OpenMP.

/***********************************************************
* FILE: omp_hello.c
* DESCRIPTION:
*   OpenMP Example - Hello World - C/C++ Version
*   In this simple example, the master thread
*   forks a parallel region. All threads in the team obtain
*   their unique thread number and print it. The master
*   thread only prints the total number of threads.  Two OpenMP
*   library routines are used to obtain the number of threads
*   and each thread's number.
* AUTHOR: Blaise Barney  5/99
* LAST REVISED: 04/06/05
************************************************************/
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char **argv) {

int nthreads, tid;

/* Fork a team of threads giving them their own copies of variables */
#pragma omp parallel private(nthreads, tid)
  {

  /* Obtain thread number */
  tid = omp_get_thread_num();
  printf("Hello World from thread = %dn", tid);

  /* Only master thread does this */
  if (tid == 0)
    {
    nthreads = omp_get_num_threads();
    printf("Number of threads = %dn", nthreads);
    }

  }  /* All threads join master thread and disband */

}

To compile this example with icc you need the OpenMP switch turned on:

rainer@novotop:/tmp> icc -openmp omp_hello.c
omp_hello.c(22): (col. 1) remark: OpenMP DEFINED REGION
WAS PARALLELIZED.
rainer@novotop:/tmp> ./a.out
Hello World from thread = 0
Number of threads = 2
Hello World from thread = 1

Ok, that’s pretty cool. We saw how to parallelize a region and giving private variables to it. By the way, you can specify the number of threads OpenMP starts with the OMP_NUM_THREADS environment variable (export OMP_NUM_THREADS=4, then start a.out -> you get four thread outputs).
Next post will handle mutexes, semaphores, thread shared memory etc. in more depth.

About installing Intel C++ 10.0 on OpenSuSE 10.2
A good tutorial

Intel C++ 10.0 for linux

Thursday, August 30th, 2007

Get the most out of it

I like gcc very much but now I have a Intel Core 2 Duo notebook, and I think it’s time to get the most out of it. That’s why I go for the Intel C++ 10.0 compiler today.

Intel provides a “free for non-commercial usage” download, that’s pretty nice and one more reason to give’em a try!

The other thing I am really interested in is the openMP integration. If you had troubles with pthreads you know why!

Start of my report

Go to the download page, confirm non-commercial agreement, register with email address, then start downloading the 45 MB package (in the IA32 version).

Untar the package and as root type
./install.sh

The installation went smooth, had to agree to several license agreements, answer some question (always took the default). Until suddenly:


Your platform :
architecture = i686
kernel = 2.6.18
glibc = glibc-2.5-25
operating system = unknown

This product is supported for use with the following combinations :

Machine Type Kernel glibc

IA-32/Intel(R) 64 2.4.x 2.2.5
IA-32/Intel(R) 64 2.4.x 2.2.93
IA-32/Intel(R) 64 2.4.x 2.3.2
IA-32/Intel(R) 64 2.6.x 2.3.x
IA-32/Intel(R) 64 2.6.x 2.4.x
IA-32/Intel(R) 64 2.6.x 2.5.x

Would you like to perform an unsupported install of this product [yes/no] (no) ? :

At this point I face my fear but typed YES.
After some other questions (always answer with default) I finally got the “successful” message:


Successfully installed:

Substitute Headers for Intel(R) C++ Compiler for applications running on IA-32, Version 10.0 (10.0.023)
intel-isubh100023-10.0.023-1.i386.rpm

Intel(R) C++ Compiler for applications running on IA-32, Version 10.0 (10.0.023)
intel-icc100023-10.0.023-1.i386.rpm

Intel(R) Debugger for applications running on IA-32, Version 10.0 (10.0.023)
intel-iidb100023-10.0.023-1.i386.rpm

Intel(R) C++ Compiler features and plugins for integration into Eclipse* CDT development environment, Version 10.0 (10.0.023)
intel-icc_ide100023-10.0.023-1.i386.rpm

Intel(R) Debugger features and plugins for integration into Eclipse* CDT development environment, Version 10.0 (10.0.023)
intel-idb_ide100023-10.0.023-1.i386.rpm

First compilation

My first compilation will be a “Hello World” as it is good tradition in the C business:

#include <stdio.h>

int main(int argc, char **argv)
{
        fprintf(stdout, "Hello ICC Worldn");

        return 0;
}

To get the icc environment up, Intel delivers a Shell-Script. Source it then compile like this:
source /opt/intel/cc/10.0.023/bin/iccvars.sh
icc hello.c

Then run the result:
./a.out
Watch the output and be happy :-)
Hello ICC World

This is so great! Tomorrow I’ll report on first experiences with openMP!
See you soon!

Started New Drupal Project

Wednesday, August 29th, 2007

I’ve started a new Drupal project in the DAX Investment business. It’s kind of “pre-alpha” but it’s already a very interesting project from a technology view. It will contain blocks with high dynamical image content as well as stock quotes. So I will need to look somewhat deeper to caching technology and AJAX.
It will also contain community features like blogs and a forum, so there’s also lot of work to do with taxonomy.
I’ll keep you informed.

Five most important drupal modules

Sunday, August 26th, 2007

drupal rules Drupal ships with a lot of necessary modules like Blog, Forum, Taxonomy, Poll, Locale …
They do most necessary tasks when building a website. But some modules I frequently need are provided by third parties.

Here is my list of five important third-party modules when building a site with drupal:

  • CCK - The Content Construction Kit allows you create and customize UI fields that can be added to any content types (Example: When building a song review database you could add a field like “Best top-ten rating” to your song-review content type.).
  • Views - The views module provides a flexible method to control how lists of content (nodes) are presented. It is essentially a smart query builder that, given enough information, can build the proper query, execute it, and display the results - including but not limited to CCK fields (Example: Create a node that displays song title and best top-ten rating).
  • Google Analytics - sophisticated integration of google’s urchin tracker code for your drupal site.
  • Google AdSense - Very good integration of Google AdSense for drupal. Allows grouping by ad format and utilization of Google’s ad channels.
  • Meta Tags - Even if Google ignores meta, it might be important once. At least there’s no harm. This module allows you to set some meta tags for each node, view or panels page.

Other webmasters, other opinions, so here are some links to several drupal module top lists:
Troy Schneider’s top ten
Daan’s list of used drupal modules
A SEO view on modules from fiLi
And 5 musts from Keith’s marketing perspective

Running tons of development servers on one linux host

Sunday, August 5th, 2007

I drive about 25 domains with different technologies like wordpress, drupal, b2evolution, lussumo vanilla, phpCMS etc. Most of that need a typical LAMP. That is a Linux, an Apache, a MySQL and a PHP. It’s common sense to have kind of test systems, systems where you can test your development work before bringing it up to production. For that I use one linux machine running OpenSuSE Linux 10.2 (basically some partitions on my laptop I use with a boot manager).

Goals of the development and testing environment

There are several goal to be met by my dev-env:

  • Having production-near environment (Tools, Versions, OS)
  • Having same code for testing as in production
  • Having production-like network structure
  • Having a permanent installation

How to setup lot’s of virtual servers on the development host

My first and most important hint: Don’t use yast2 for setting up the virtual apache hosts. That module is still buggy. Use it only to set up apache the first time.

Prerequisites

I assume you have apache2, MySQL4 or MySQL 5 and PHP4 or PHP5 up and running. All you need now is a virtual host, a new database and a new database user to run the dev-env. What you get from your production hosting provider is a domain, a database server, a database name and a database user.

Example: www.geekland.de

As an example I use my domain geekland.de. It is hosted by 1&1 and has the following attributes (not really exactly these :-) ):

domain: geekland.de
db-host: db1234.1und1.de
db-user: dbo12345678
db-pwd: qwertz123
database: db12345678
CMS: wordpress 2.1
Tools: PHP5, MySQL 5, Apache 2

Setting up the local development domain

Because I don’t want to mingle the real domains, I use a TLD “.test” on my local machine. For the example that means, I set up the domain “geekland.test” on my host.

Setting up a virtual network interface

That’s an easy task within unix. As root use

ifconfig lo:1 127.0.0.2

and add in /etc/hosts

127.0.0.2 geekland.test www.geekland.test

Starting an apache virtual server on this virtual interface

Add the virtual server in your apache’s httpd.conf file:

NameVirtualHost 127.0.0.2
<VirtualHost 127.0.0.2>
ServerName www.geekland.test
DocumentRoot /srv/www/vhosts/geekland
</VirtualHost>

Now put your htdocs file into /srv/www/vhosts/geekland and don’t forget to restart your apache!

Create a database on your local MySQL server

Login in to your MySQL server via mysql command, then issue the following command:

CREATE DATABASE `db12345678` ;

Create a database user on your local MySQL server

Now create a database user and grant login rights:

CREATE USER 'dbo12345678'@'localhost'
IDENTIFIED BY 'qwertz123';

GRANT USAGE
ON * . * TO 'dbo12345678'@'localhost'
IDENTIFIED BY 'qwertz123'
WITH MAX_QUERIES_PER_HOUR 0
MAX_CONNECTIONS_PER_HOUR 0
MAX_UPDATES_PER_HOUR 0
MAX_USER_CONNECTIONS 0 ;

Now grant special rights (all) to the new user for the new database:

GRANT ALL PRIVILEGES
ON `db12345678` . *
TO 'dbo12345678'@'localhost'
WITH GRANT OPTION ;

Alias the DB-Server to localhost

As I don’t need any access to the hoster’s DB machine db1234.1und1.de. I alias that host to my localhost. With that simple trick I can use the same config (like wp-config.php) file on my dev-env as on the production environment.
In /etc/hosts modify the localhost line to contain the DB Server:
127.0.0.1 localhost db1234.1und1.de

Now you’re done. You can use all the same files on your production plattform and your development plattform now. The only thing you need to take care is to change the top level domain if necessary (i.e. in DB dump files of wordpress).

The next project

Your next project can be set up in exactly the same way, just change the virtual interface to lo:2 127.0.0.3 and the apache config accordingly.