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