|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Author: Sangamesh Ragate
|
|
Packit |
577717 |
* Date : 18th Nov 2015
|
|
Packit |
577717 |
* ICL-UTK
|
|
Packit |
577717 |
* Description : This is the parent process that Preloads the libactivity.so
|
|
Packit |
577717 |
* and launches the cuda application for performing PC-Sampling
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <string.h>
|
|
Packit |
577717 |
#include <unistd.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <sys/wait.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "path.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int main(int argc,char** argv){
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int pid;
|
|
Packit |
577717 |
if(argc < 2){
|
|
Packit |
577717 |
printf("please supply Cuda app to be profiled \n");
|
|
Packit |
577717 |
exit(-1);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
//get CUDA device ID and sampling rate from args
|
|
Packit |
577717 |
char *samp, *device;
|
|
Packit |
577717 |
extern char* optarg;
|
|
Packit |
577717 |
extern int optind;
|
|
Packit |
577717 |
int c,tmp,index;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
//set default samp and device
|
|
Packit |
577717 |
device="0";
|
|
Packit |
577717 |
samp="5";
|
|
Packit |
577717 |
index=1;
|
|
Packit |
577717 |
while((c=getopt(argc,argv,"d:s:"))!=-1){
|
|
Packit |
577717 |
switch(c){
|
|
Packit |
577717 |
case 'd':
|
|
Packit |
577717 |
device = optarg;
|
|
Packit |
577717 |
tmp=atoi(device);
|
|
Packit |
577717 |
index = optind;
|
|
Packit |
577717 |
if(tmp < 0){
|
|
Packit |
577717 |
printf("GPU device ID not valid \n");
|
|
Packit |
577717 |
exit(-1);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
case 's':
|
|
Packit |
577717 |
samp = optarg;
|
|
Packit |
577717 |
tmp=atoi(samp);
|
|
Packit |
577717 |
//record index for argument forming for cuda app
|
|
Packit |
577717 |
index = optind;
|
|
Packit |
577717 |
if(tmp < 0 || tmp > 5){
|
|
Packit |
577717 |
printf("PC sampling rate not valid \n");
|
|
Packit |
577717 |
exit(-1);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
case '?':
|
|
Packit |
577717 |
printf("Switch not recognized by papi_sampling_cuda utility \n");
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
//form the arg list for the cuda app
|
|
Packit |
577717 |
char** var;
|
|
Packit |
577717 |
var=&argv[index];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
char* ld_lib;
|
|
Packit |
577717 |
char env1[1024];
|
|
Packit |
577717 |
char env2[256];
|
|
Packit |
577717 |
char env3[256];
|
|
Packit |
577717 |
int status;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
//get the shared library load path
|
|
Packit |
577717 |
strcpy(env1,"LD_LIBRARY_PATH=");
|
|
Packit |
577717 |
ld_lib=getenv("LD_LIBRARY_PATH");
|
|
Packit |
577717 |
if(ld_lib == NULL){
|
|
Packit |
577717 |
printf("Error loading CUDA shared libraries: LD_LIBRARY_PATH=NULL \n");
|
|
Packit |
577717 |
exit(-1);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
strcat(env1,ld_lib);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy(env2,"GPU_DEVICE_ID=");
|
|
Packit |
577717 |
strcat(env2,device);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy(env3,"PC_SAMPLING_RATE=");
|
|
Packit |
577717 |
strcat(env3,samp);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
//form the env variable
|
|
Packit |
577717 |
char* env[]={env1,env2,env3,ld_prld, NULL};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf("\n\n\n\n");
|
|
Packit |
577717 |
printf("***************** PAPI_SAMPLING_CUDA utility **********************\n");
|
|
Packit |
577717 |
pid=fork();
|
|
Packit |
577717 |
if(pid==0){
|
|
Packit |
577717 |
execve(var[0],var,env);
|
|
Packit |
577717 |
}else if(pid==-1){
|
|
Packit |
577717 |
printf("Profile fork failed \n");
|
|
Packit |
577717 |
exit(-1);
|
|
Packit |
577717 |
}else{
|
|
Packit |
577717 |
wait(&status);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|