Digging Intel Itanium: RSE Register Stack Engine

Itanium processors heralded a new era or processing. Though not very successful commercially, IPF has added many wonderful techniques to computer science. I’ll discuss the one I liked the most.

It is called RSE (Register Stack Engine), a technique to avoid using main memory during function calls and do the stuff in processor register itself. When a function call is made, calling function passes the arguments that are saved in main memory. After this, the return address is saved. Main memory access is slower when compared to processor speed. Itanium has 128 GPR and out of those 96 are available for RSE. These 96 registers take care of function call mechanism, appearing as a register stack frame to the application. This bypasses memory access till all 96 registers are occupied. Interestingly, processor itself is responsible for running this show and it’s transparent to the application.

More here

Hard drives: Native Command Ordering

A simple hard drive today is capable of things that sound like some outlandish technology. Just try to do some file I/O in your application and do it with many threads.

Say you have 4 threads, A,B,C, and D. And request to do I/O comes in A then B and so on. If you check the return status of these threads, the ordering might be surprising. Thread D may return before A. How?

Disk have a technology called Native Command Ordering. So they take your request in and process them on a single, simple logic:

Serve the one which you can do fastest.

This depends on the head position of the disk. The request that can be served with minimal movement of head, is served first.

>A few ‘why’ answered

>There are certain ‘why’ that we may have missed, so I am trying to attend them…one by one.

o Why do we need hash table?
Of course, for better, faster search. It could even get us an element in O(1).

But we need to use hash because if given data is in a form which can’t be ordered; we need hashing. Example can be images. How will you order a set of images and search any.
Hashing comes to help here. It generates a unique(ideally) hash key for given such data. We save these keys in a hash table. So searching an image is now searching a key in hash table. Keys are generated with a hash function. More about that later.

To be continued with more whys.

HP Caliper : A dynamic performance analyzer (Profiler)

Developer rarely get concerned for efficiency of their programming logic. It’s not a hard-and-fast observation but that’s how most of amateur developer write the code. But performance is becoming critical day by day and commercial applications vie for as much performance gain as possible.

Performance can degrade for motley of reasons but application logic is what we are going to stress here. You may write a code that performs badly with cache system of your hardware or you schedule your threads inappropriately. There may be many reasons that one may not be aware of until someone find it out.

HP Caliper is one of my favorite tool that can help you with finding many causes of application slowdown. It is an Intel Itanium based tool and runs on HPUX & Linux.
Talk about its feature and I may run out of space. It can make basic profiles like sampled call-graph, flat function profile, CPU events profile. Besides it can provide call-stack profile (critical for I/O bound applications), data cache profile (to help you re-layout the data structures).

Best part is that it does not need a recompile of application or any library. Just give it a binary or attach it to a process. Run it and there you are with third party insight in to your logic. It comes with a command line interface and GUI.

Only downside is that it runs on Itanium binaries only so other users have to wait till it become available for them too.

Happy profiling!!

NUI: Mobile GUI development

I found “nui”, a C++ based GUI development framework. You can develop iPhone apps as well. It runs on Linux, Windows, Mac.

I also came to know about “enthought” (http://www.enthought.com/). Another GUI development framework. This guy automatically develop the GUI if you provide the class definition.

I’ve not tried both of these. But they both sound interesting, so thought of sharing ๐Ÿ™‚

>Python questions for interview

>Python is a bliss for quick development. It’s a mix of C & C++ features and comes in flavor of a script. For a C/C++ developer who happen to work with Python, here are few interview questions that are frequently asked:

1. what all Python can do for you in OOP?
Python fairly supports OOP principles. You can declare and define classes that follow same philosophy of OOP(similar to C++, Java). Besides features like inheritance, polymorphism are also there.

2. Does it support operator overloading?
You can have operator overloading also.

3. What is pickling?
It’s an object serialization technique. Very similar to marshaling/un-marshaling that packet data in networks.

4. Does it support function overloading?

5. How do you pass variable number of arguments to a function?
def foo(*pass_many):

In the function you should retrieve the arguments as a tuple.

6. Difference between a tuple and list?
You know it. Tuples are immutable objects while list are mutable.

Highly recommended: http://www.learningpython.com/2008/06/21/operator-overload-learn-how-to-change-the-behavior-of-equality-operators/

Careful with both hands while using the fork!

fork() is one of the most useful features of C/Linux/UNIX. But it’s like a double edged sword, so be careful with fork ๐Ÿ™‚
Of late, I got stuck in a weird problem with one of the client application(A) that interacts with another application(B). Application A was hanging when used application B; otherwise alone A runs just fine.
Now, what to do? We did a thorough examination of both the applications and found that A is waiting on a pipe P. P has its right end with B and A has got the read end. But why this wait? There is no need to keep this pipe open in first place.
So here fork() comes in to picture. Actually, A forks B and then B interacts with A. When A fork() B, B gets a copy of all open file descriptors(FD) of A as well. There you go!
After getting these FDs, B does not take care to close them. But A checks if any of its FD is still open. Since the file is open with B, the kernel will tell A that some of your files are being accessed. So just wait ๐Ÿ˜ฆ And this wait never ends…
This was it. A simple close() call in B for all FDs worked for us. And B happily got away with A.

A word of advice: Always call exit() from a child. exit() does basic clean up and calls _exit() which more work including closing all files open with a child.

Just to verify, you can use this test program:

#include "fcntl.h"
#include "stdlib.h"

int main()
int fd = -1;
int status;
char buf[512];

fd = open("abc.txt", O_CREAT);

int pid = fork();

if(pid == 0) { // Child
puts("Child says bye");
} else { // Parent
int ch = read(fd, buf, 16);
printf("\nRead returns %d\n", ch);

>Lichen: Our first invention

>We, a group of three friends have got our first ever invention disclosure published today. It’s quite a happy moment for all of us. We started with a small idea that eventually got transformed into a serious paper ๐Ÿ™‚

Title : Lichen: A Framework For Characterizing Sporadic Performance Constrictions In Non-deterministic Applications”

The idea deals with better profiling of application with a special way of sample collection.
Our paper is published in worldwide publication Research Journal. (http://www.researchdisclosure.com)

>Terminal problem with csh/ksh

>If you are a bash addict and you have to work in csh/ksh; you may face terminal problem with csh/ksh while using vi/more or any such command. vi expects complete knowledge of the terminal where it’s going to display its contents. There is a simple way to fix it.

1. First get the shell type by: $echo $SHELL
This is just to confirm that you are in csh/ksh.

2. Figure out what is the terminal type. If you do not know then ask your system administrator.

3. If you can’t, that’s also okay. ๐Ÿ™‚ We’ll try to use default terminal emulator type called “vt100”.

4. Now you need to export the terminal type to your csh/ksh.
$setenv TERM vt100

5. There you go. Try to open a vi session.

Let me know if you face any issue.