예제 #1
0
/****************************************************************************
  Message Handler: get_status(handle) -> status_res(handle, known, running, numerator, denominator)
 ****************************************************************************/
int msg_get_status(Client *cli, unsigned char *arg, int arg_len)
{
    char *handle = (char*)arg;
    if (arg_len > MAX_HANDLE_LEN) {
        g_warning("[%s] Invalid handle length received: %d", cli->id, arg_len);
        return -1;
    }

    #if DEBUG
    g_debug("[%s] get_status(%s)", cli->id, handle);
    #endif

    char *known = "0";
    char *running = "0";
    int numerator = -1;
    int denominator = -1;

    Job *job = g_hash_table_lookup(g_jobs, handle);
    if (job) {
        known = "1";
        if (job->worker)
            running = "1";
        numerator = job->status[0];
        denominator = job->status[1];
    }

    MemBlock *block = new_response(MSG_STATUS_RES, 256, NULL);
    char *p = (char*)block->bytes + HEADER_SIZE;
    p += sprintf(p, handle) + 1;
    p += sprintf(p, known) + 1;
    p += sprintf(p, running) + 1;
    if (numerator >= 0) {
        p += sprintf(p, "%d", numerator) + 1;
        p += sprintf(p, "%d", denominator);
    } else {
        *(p++) = 0;
    }
    block->nbytes = (unsigned char*)p - block->bytes;
    set_message_size(block, block->nbytes - HEADER_SIZE);
    client_send(cli, block);

    return 0;
}
예제 #2
0
enum po_ret_type
process_options (int argc, char *argv[])
{
    extern char * optarg;
    extern int optind, optopt;

    char const * optstring = "+:hvfm:i:x:M:t:s:";
    int c;

    if (accel_enabled) {
        optstring = (CUDA_KERNEL_ENABLED) ? "+:d:hvfm:i:x:M:t:r:s:"
            : "+:d:hvfm:i:x:M:t:s:";
    }

    /*
     * SET DEFAULT OPTIONS
     */
    options.accel = none;
    options.show_size = 1;
    options.show_full = 0;
    options.num_probes = 0;
    options.device_array_size = 32; 
    options.target = cpu;
    options.min_message_size = DEFAULT_MIN_MESSAGE_SIZE;
    options.max_message_size = DEFAULT_MAX_MESSAGE_SIZE;
    options.max_mem_limit = MAX_MEM_LIMIT;
    options.iterations = 1000;
    options.iterations_large = 100;
    options.skip = 200;
    options.skip_large = 10;

    while ((c = getopt(argc, argv, optstring)) != -1) {
        bad_usage.opt = c;
        bad_usage.optarg = NULL;
        bad_usage.message = NULL;

        switch (c) {
            case 'h':
                return po_help_message;
            case 'v':
                return po_version_message;
            case 'm':
                if (set_message_size(optarg)) {
                    bad_usage.message = "Invalid Message Size";
                    bad_usage.optarg = optarg;

                    return po_bad_usage;
                }
                break;
            case 't':
                if (set_num_probes(atoi(optarg))){
                    bad_usage.message = "Invalid Number of Probes";
                    bad_usage.optarg = optarg;

                    return po_bad_usage;
                }
                break;
            case 'i':
                if (set_num_iterations(atoi(optarg))) {
                    bad_usage.message = "Invalid Number of Iterations";
                    bad_usage.optarg = optarg;

                    return po_bad_usage;
                }
                break;
            case 'x':
                if (set_num_warmup(atoi(optarg))) {
                    bad_usage.message = "Invalid Number of Warmup Iterations";
                    bad_usage.optarg = optarg;

                    return po_bad_usage;
                }
                break;
            case 's':
                if (set_device_array_size(atoi(optarg))){
                    bad_usage.message = "Invalid Device Array Size";
                    bad_usage.optarg = optarg;
                    
                    return po_bad_usage;
                }
                break;
            case 'f':
                options.show_full = 1;
                break;
            case 'M': 
                /*
                 * This function does not error but prints a warning message if
                 * the value is too low.
                 */
                set_max_memlimit(atoll(optarg));
                break; 
            case 'd':
                if (!accel_enabled) {
                    bad_usage.message = "Benchmark Does Not Support "
                        "Accelerator Transfers";
                    bad_usage.optarg = optarg;
                    return po_bad_usage;
                }
                else if (0 == strncasecmp(optarg, "cuda", 10)) {
                    if (CUDA_ENABLED) {
                        options.accel = cuda;
                    }
                    else {
                        bad_usage.message = "CUDA Support Not Enabled\n"
                            "Please recompile benchmark with CUDA support";
                        bad_usage.optarg = optarg;
                        return po_bad_usage;
                    }
                }
                else if (0 == strncasecmp(optarg, "managed", 10)) {
                    if (CUDA_ENABLED) {
                        options.accel = managed;
                    }
                    else {
                        bad_usage.message = "CUDA Managed Memory Support Not Enabled\n"
                            "Please recompile benchmark with CUDA support";
                        bad_usage.optarg = optarg;
                        return po_bad_usage;
                    }
                }
                else if (0 == strncasecmp(optarg, "openacc", 10)) {
                    if (OPENACC_ENABLED) {
                        options.accel = openacc;
                    }
                    else {
                        bad_usage.message = "OpenACC Support Not Enabled\n"
                            "Please recompile benchmark with OpenACC support";
                        bad_usage.optarg = optarg;
                        return po_bad_usage;
                    }
                }
                else {
                    bad_usage.message = "Invalid Accel Type Specified";
                    bad_usage.optarg = optarg;
                    return po_bad_usage;
                }
                break;
            case 'r':
                if (CUDA_KERNEL_ENABLED) {
                    if (0 == strncasecmp(optarg, "cpu", 10)) {
                        options.target = cpu;
                    } else if (0 == strncasecmp(optarg, "gpu", 10)) {
                        options.target = gpu;
                    } else if (0 == strncasecmp(optarg, "both", 10)) {
                        options.target = both;
                    } else {
                        bad_usage.message = "Please use cpu, gpu, or both";
                        bad_usage.optarg = optarg;
                        return po_bad_usage;
                    }
                } else {
                    bad_usage.message = "CUDA Kernel Support Not Enabled\n"
                        "Please recompile benchmark with CUDA Kernel support";
                    bad_usage.optarg = optarg;
                    return po_bad_usage;
                }
                 break;
            case ':':
                bad_usage.message = "Option Missing Required Argument";
                bad_usage.opt = optopt;
                return po_bad_usage;
            default:
                bad_usage.message = "Invalid Option";
                bad_usage.opt = optopt;
                return po_bad_usage;
        }
    }

    return po_okay;
}