Blame src/components/cuda/sampling/gpu_activity.c

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
}