Note that when TAU is built with charm++, only charm++ programs can use the resulting library. Additionally, no TAU calls can be made before the ConverseInit call.
When using TAU_COMPILER with charm++, the following change must be made to charm/src/conv-core/converse.h :
static __inline__ unsigned long long int rdtsc(void) { unsigned long long int x; #ifdef CMK_IA64 __asm__ __volatile__("mov %0=ar.itc" : "=r"(x) :: "memory"); #else __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); #endif return x; }Must be changed to :
static __inline__ unsigned long long int rdtsc(void) { unsigned long long int x; #ifndef TAU_CHARM #ifdef CMK_IA64 __asm__ __volatile__("mov %0=ar.itc" : "=r"(x) :: "memory"); #else __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); #endif #endif return x; }This is due to the EDG front-end parse not parsing the __asm__ directive properly.
this website should have the most up to date information on how to build NAMD with TAU.
wget http://www.cs.uoregon.edu/research/paracomp/proj/pdtoolkit/Download/pdt_latest.tar.gz tar xzf pdt_latest.tar.gz cd pdtoolkit-3.3.1 ./configure ; make ; make install
wget http://www.cs.uoregon.edu/research/paracomp/proj/tau/tauprofile/dist/tau_latest.tar.gz tar xzf tau_latest.tar.gz cd tau-2.14.3 ./configure -pdt=<path to pdt> -charm=<path to charm>Note that TAU can be configure to use various options (-TRACE, -PROFILECALLPATH, etc) with -PROFILE as the default.
cd NAMD_2.5_Source patch < path/to/tau/examples/charm/namd-2.5.patchAlternatively see the manual patching instructions below.
"CXX = ..."to
"CXX = $(TAU_COMPILER) -optTauSelectFile=<path to select.tau> ..."
"CC = ..."to
"CC = $(TAU_COMPILER) -optTauSelectFile=<path to select.tau> ..."
include /home/amorris/tau2/include/Makefile NAMD_ARCH = Linux-i686 CHARMARCH = net-linux CXX = $(TAU_COMPILER) -optTauSelectFile=/home/amorris/select.tau g++ -DSOCKLEN_T=socklen_t -DNO_STRSTREAM_H CXXOPTS = -O3 -march=pentiumpro -ffast-math -static CC = $(TAU_COMPILER) -optTauSelectFile=/home/amorris/select.tau gcc COPTS = -O3 -march=pentiumpro -ffast-math -static
export PROFILEDIR=/tmp export TRACEDIR=/tmp
BEGIN_EXCLUDE_LIST void Sequencer::thread# void Controller::thread# int NAMD_read_int# void PDBDATA::scan# Real PDBAtom::zcoor# Real PDBAtom::ycoor# Real PDBAtom::xcoor# Bool Molocule::is_hydrogen# END_EXCLUDE_LIST BEGIN_FILE_EXCLUDE_LIST *mainfunc.C *memusage.C *BackEnd.C END_FILE_EXCLUDE_LIST
Add $(TAU_COMPILER) to the link phase, as shown
namd2: $(INCDIR) $(DSTDIR) $(OBJS) $(LIBS) $(MAKEBUILDINFO) $(TAU_COMPILER) $(CHARMC) -verbose -ld++-option \ "$(COPTI)$(CHARMINC) $(COPTI)$(INCDIR) $(COPTI)$(SRCDIR) $(CXXOPTS)" \ -module NeighborLB -module commlib -language charm++ \ $(BUILDINFO).o \ $(OBJS) \ $(DPMTALIB) \ $(DPMELIB) \ $(TCLLIB) \ $(FFTLIB) \ $(PLUGINLIB) \ -lm -o namd2
#include <TAU.h> extern "C" void Tau_create_top_level_timer_if_necessary(void);
void BackEnd::init(int argc, char **argv) { ConverseInit(argc, argv, slave_init, 1, 1); // calls slave_init on others TAU_PROFILE_SET_NODE(CmiMyPe()); Tau_create_top_level_timer_if_necessary(); TAU_PROFILE("BackEnd::init", "", TAU_DEFAULT); cpuTime_start = CmiCpuTimer(); wallTime_start = CmiWallTimer(); if ( CmiMyPe() ) { slave_init(argc, argv); // for procs that call main TAU_PROFILE_EXIT("Calling ConverseExit()"); ConverseExit(); // should never return } all_init(argc, argv);
#include <TAU.h>
int main(int argc, char **argv) { BackEnd::init(argc,argv); TAU_PROFILE("int main(int, char**) C", " ", TAU_DEFAULT); ScriptTcl *script = new ScriptTcl; Node::Object()->setScript(script); ... TAU_PROFILE_EXIT("main exiting"); BackEnd::exit(); return 0; }
#include <TAU.h>
void Controller::threadRun(Controller* arg) { TAU_REGISTER_THREAD(); arg->algorithm(); }
void Controller::terminate(void) { TAU_PROFILE_EXIT("Controller::terminate"); BackEnd::awaken(); CthFree(thread); CthSuspend(); }
#include <TAU.h>
void Sequencer::threadRun(Sequencer* arg) { TAU_REGISTER_THREAD(); arg->algorithm(); }
void Sequencer::terminate(void) { TAU_PROFILE_EXIT("Sequencer::terminate"); CthFree(thread); CthSuspend(); }