From: <gs...@us...> - 2010-05-13 01:49:08
|
Revision: 58 http://cudawrapper.svn.sourceforge.net/cudawrapper/?rev=58&view=rev Author: gshi Date: 2010-05-13 01:48:59 +0000 (Thu, 13 May 2010) Log Message: ----------- add a mode to support global GPU map change Modified Paths: -------------- trunk/cuda_wrapper.c trunk/cuda_wrapper.h trunk/wrapper_init.c trunk/wrapper_terminate.c Modified: trunk/cuda_wrapper.c =================================================================== --- trunk/cuda_wrapper.c 2010-05-03 16:56:53 UTC (rev 57) +++ trunk/cuda_wrapper.c 2010-05-13 01:48:59 UTC (rev 58) @@ -59,6 +59,7 @@ #include <pthread.h> #include <unistd.h> #include <sys/time.h> +#include <wrapper_common.h> /* There are two possible ways to determine if the program is using cuda API * The first one is checking the executible in the contructor @@ -107,6 +108,7 @@ static int cuda_virt_disabled= 0; static int nGPU; static int cuda_exec = 0; +static int magic_job_enabled= 0; static __thread cudaEvent_t start_event, stop_event; static __thread double gpu_kernel_time =0; @@ -312,7 +314,7 @@ return 0; } - if (!wrapper_info || wrapper_info->userID != userID){ + if (!wrapper_info || (wrapper_info->userID != userID && !magic_job_enabled)){ passThru = 0; available = 0; return 0; @@ -1307,6 +1309,18 @@ char *JOBID; int jobID; + //test the magic jobid + key = MAGIC_JOBID; + shmid = shmget(key, sizeof(struct cuda_wrapper), WRAPPER_SHMEM_PERM); + if (shmid != -1){ //shared memory with magic jobid is present + data = (char*)shmat(shmid, (void*)0, 0); + if (data != (char*)-1){//found the shared memory segment + magic_job_enabled=1; + return (cuda_wrapper_t)data; + } + } + + JOBID = getenv("PBS_JOBID"); if (!JOBID){ /* Not running in a PBS environment. No shared memory */ Modified: trunk/cuda_wrapper.h =================================================================== --- trunk/cuda_wrapper.h 2010-05-03 16:56:53 UTC (rev 57) +++ trunk/cuda_wrapper.h 2010-05-13 01:48:59 UTC (rev 58) @@ -43,6 +43,7 @@ #ifndef _CUDA_WRAPPER_H_ #define _CUDA_WRAPPER_H_ +#define MAGIC_JOBID 0x7a3a4b5c #define MAX_GPUS_PER_NODE 8 #define WRAPPER_SHMEM_PERM 0666 #define MAX_KEY_ENV_VAR 32 Modified: trunk/wrapper_init.c =================================================================== --- trunk/wrapper_init.c 2010-05-03 16:56:53 UTC (rev 57) +++ trunk/wrapper_init.c 2010-05-13 01:48:59 UTC (rev 58) @@ -60,6 +60,8 @@ {"<unique key>", 1, 0, 'k'}, {"verbose", 0, 0, 'v'}, {"check only", 0, 0, 'l'}, + {"keep GPU order", 0, 0, 'd'}, + {"usee magic jobid", 0, 0, 'm'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; @@ -71,9 +73,10 @@ static int userID = -1; static cuda_wrapper_t wrapper; static unsigned int verbose = 0; -static signed int jobID = 0; +static signed int jobID = -1; static unsigned int checkonly = 0; static char* configFile = NULL; +static int keeporder =0; #define DEFAULT_CONFIG_FILE "/etc/cuda_wrapper.conf" #define MAXLINE 256 @@ -99,9 +102,11 @@ printf("\t-c <config file>\n"); printf("\t-g <GPU allocated file> # required for instantiation\n"); - printf("\t-u <user id> # required\n"); - printf("\t-k <unique instance key> # required, e.g. $PBS_JOBID\n"); + printf("\t-u <user id> # required (unless -m is used)\n"); + printf("\t-k <unique instance key> # required, e.g. $PBS_JOBID (unless -m is used)\n"); + printf("\t-m # use magic jobid (mutually exlusive with -k option)\n"); printf("\t-l # list info from shared memory (if it exists)\n"); + printf("\t-d # keep the physical GPU order in the file\n"); printf("\t-v # verbose\n"); printf("\t-h # print out this message\n"); @@ -315,7 +320,9 @@ /*sort the physical GPUs*/ - qsort(wrapper->physGPU, wrapper->nGPU, sizeof(int), compare_int); + if (!keeporder){ + qsort(wrapper->physGPU, wrapper->nGPU, sizeof(int), compare_int); + } //fprintf(stdout, "Total # of GPUs allocated for job: %d\n", wrapper->nGPU); @@ -337,7 +344,7 @@ int ret = 0; optind = 1; - while ((retval = getopt_long(argc, argv, "g:u:vk:lhc:", + while ((retval = getopt_long(argc, argv, "g:u:vk:lhc:dm", long_options, &option_index)) != -1) { switch(retval){ case 'g': @@ -349,15 +356,26 @@ break; case 'k': - jobID = wrapper_atoi(optarg); - if (jobID <= 0){ - printf("ERROR: invalid unique key"); - print_usage(argv[0]); - return -1; - } - - break; - + if (jobID == MAGIC_JOBID){ + printf("ERROR: setting jobid is mutually exclusive with magic jobid(-m)\n"); + print_usage(argv[0]); + return -1; + } + jobID = wrapper_atoi(optarg); + if (jobID <= 0){ + printf("ERROR: invalid unique key"); + print_usage(argv[0]); + return -1; + } + + break; + case 'm': + if (jobID > 0){ + printf("ERROR: setting jobid is mutually exclusive with magic jobid(-m)\n"); + print_usage(argv[0]); + } + jobID=MAGIC_JOBID; + break; case 'l': checkonly = 1; break; @@ -365,7 +383,10 @@ case 'c': configFile=strdup(optarg); break; - + case 'd': + keeporder=1; + break; + case 'v': verbose = 1; break; @@ -394,8 +415,8 @@ - /* Make sure we atleast have a GPU allocation map and user ID specified. */ - if (!gpuMapFile || userID < 0 || jobID == 0){ + /* Make sure we atleast have a GPU allocation map and user ID specified (unless magic jobid is used). */ + if (!gpuMapFile || (userID < 0 && jobID != MAGIC_JOBID) || jobID == 0){ print_usage(argv[0]); return -1; } Modified: trunk/wrapper_terminate.c =================================================================== --- trunk/wrapper_terminate.c 2010-05-03 16:56:53 UTC (rev 57) +++ trunk/wrapper_terminate.c 2010-05-13 01:48:59 UTC (rev 58) @@ -55,7 +55,8 @@ static struct option long_options[] = { - {"<unique key> # required, e.g. $PBS_JOBID", 1, 0, 'k'}, + {"<unique key> #e.g. $PBS_JOBID", 1, 0, 'k'}, + {"<use magic jobid> ", 1, 0, 'm'}, {"help", 0, 0, 'h'}, {"print GPU processid", 0, 0, 'p'}, {0, 0, 0, 0} @@ -135,17 +136,30 @@ /* Parse argument options */ optind = 1; - while ((retval = getopt_long(argc, argv, "k:hp", + while ((retval = getopt_long(argc, argv, "k:hpm", long_options, &option_index)) != -1) { switch(retval){ case 'k': - jobID = wrapper_atoi(optarg); - if (jobID <= 0){ - fprintf(stderr, "Error: invalid key\n"); + if (jobID == MAGIC_JOBID){ + printf("ERROR: setting jobid is mutually exclusive with magic jobid(-m)\n"); + print_usage(argv[0]); + return -1; + } + jobID = wrapper_atoi(optarg); + if (jobID <= 0){ + fprintf(stderr, "Error: invalid key\n"); print_usage(argv[0]); return -1; } break; + case 'm': + if (jobID > 0){ + printf("ERROR: setting jobid is mutually exclusive with magic jobid(-m)\n"); + print_usage(argv[0]); + return -1; + } + jobID = MAGIC_JOBID; + break; case 'p': print_gpu_processid = 1; break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |