Exemple #1
0
static odp_pktio_t create_pktio(int iface_idx, odp_pktio_input_mode_t imode,
				odp_pktio_output_mode_t omode)
{
	odp_pktio_t pktio;
	odp_pktio_param_t pktio_param;
	const char *iface = iface_name[iface_idx];

	odp_pktio_param_init(&pktio_param);

	pktio_param.in_mode = imode;
	pktio_param.out_mode = omode;

	pktio = odp_pktio_open(iface, pool[iface_idx], &pktio_param);
	if (pktio == ODP_PKTIO_INVALID)
		pktio = odp_pktio_lookup(iface);
	CU_ASSERT(pktio != ODP_PKTIO_INVALID);
	CU_ASSERT(odp_pktio_to_u64(pktio) !=
		  odp_pktio_to_u64(ODP_PKTIO_INVALID));
	/* Print pktio debug info and test that the odp_pktio_print() function
	 * is implemented. */
	if (pktio != ODP_PKTIO_INVALID)
		odp_pktio_print(pktio);

	if (wait_for_network)
		spin_wait(ODP_TIME_SEC_IN_NS / 4);

	return pktio;
}
Exemple #2
0
void s_barrier()
{
	if (run_cpus == 1 || v->fail_safe & 3) {
		return;
	}
	spin_wait(&barr->s_st1);     /* Wait if the barrier is active */
        spin_lock(&barr->s_lck);     /* Get lock for barr struct */
        if (--barr->s_count == 0) {  /* Last process? */
                barr->s_st1.slock = 0;   /* Hold up any processes re-entering */
                barr->s_st2.slock = 1;   /* Release the other processes */
                barr->s_count++;
                spin_unlock(&barr->s_lck); 
        } else {
                spin_unlock(&barr->s_lck); 
                spin_wait(&barr->s_st2);	/* wait for peers to arrive */
                spin_lock(&barr->s_lck);   
                if (++barr->s_count == barr->s_maxproc) { 
                        barr->s_st1.slock = 1; 
                        barr->s_st2.slock = 0; 
                }
                spin_unlock(&barr->s_lck); 
        }
}
void Scheduler::resume(Thread * _thread)
{
	if((tag==1) && (front==rear))
	{
		Console::puts("Queue is full\n");
		for(;;);
	}
	else
	{
		queue[rear]=_thread;
		rear=(rear+1)%M;
		tag=1;
		spin_wait("resume a thread onto ready queue\n",5000000);
	}
}
void Scheduler::yield()
{
	if((tag==0) && (front==rear))
	{
		Console::puts("Queue is empty\n");
		//for(;;);
	}
	else
	{
		Thread * nexthread=queue[front];
		front=(front+1)%M;
		tag=0;
		spin_wait("A new thread taken out\n",5000000);
		Thread::dispatch_to(nexthread);
	}
}
Exemple #5
0
static void unit_work(MemtestContext *ctx) {
#ifndef NO_BARRIER
# define setup_barrier sb_spin(ctx->barrier)
#else 
# define setup_barrier 
#endif
    cl_int err;
    int idx;

    bool mixed_mode = ctx->shared_info->mixed_mode;
    int leader_id = ctx->shared_info->leader_id;

    // BARRIER
    setup_barrier;

    int gpu_id = ctx->id;
    size_t memsize = ctx->shared_info->memsize[gpu_id];
    cl_context cl_ctx = ctx->memtest->contexts[gpu_id];
    cl_command_queue queue = ctx->memtest->queues[gpu_id];
    cl_kernel kernel = ctx->memtest->knl_inc[gpu_id];

    long long ts_delta = ctx->shared_info->gpu_ts_profile[gpu_id];
    long long rw_offset_min = LLONG_MAX;
    for (idx = 0; idx < ctx->memtest->ndevices; idx++) {
        if (rw_offset_min > ctx->shared_info->rw_offsets[idx])
            rw_offset_min = ctx->shared_info->rw_offsets[idx];
    }
    long long rw_offset = ctx->shared_info->rw_offsets[gpu_id] - rw_offset_min;


    cl_uchar *buffer = calloc(memsize, sizeof(cl_uchar));
    if (!buffer) {
        fprintf(stderr, "Out of Memory\n");
        abort();
    }

    if (ctx->shared_info->randomize_buffer) {
        unsigned int seed = (unsigned int)time(NULL);
        cl_uchar* b_iter, *b_end;
        b_end = buffer + memsize;
        for (b_iter = buffer; b_iter < b_end; b_iter++) {
            *b_iter = (cl_uchar)rand_r(&seed);
        }
    }

    // BARRIER
    setup_barrier;

    cl_mem mem_arr;
    mem_arr = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE, sizeof(cl_uchar) * memsize, NULL, &err);
    CHECK_ERROR;
    fprintf(stderr, "Created a buffer\n");
    fprintf(stderr, "[%d]Starting to transfer the buffer to each device..\n", gpu_id);

    // BARRIER
    setup_barrier;
    if (mixed_mode && gpu_id != leader_id) {
        setup_barrier;
        setup_barrier;
        setup_barrier;
    }
    spin_wait(rw_offset);
    clock_t st_t = clock();

    cl_event h2d_ev, d2h_ev, kernel_ev;
    err = clEnqueueWriteBuffer(queue, mem_arr, CL_TRUE, 0, sizeof(cl_uchar) * memsize, buffer, 0, NULL, &h2d_ev);
    CHECK_ERROR;

    clFinish(queue);
    clWaitForEvents(1, &h2d_ev);
    GpuLog_log(ctx->shared_info->logger, gpu_id, "H2DMemcpy", ts_delta, h2d_ev);
    clReleaseEvent(h2d_ev);

    // BARRIER
    setup_barrier;

    fprintf(stderr, "Transfered the buffer to each device..(%.3lf)\n", ((double)st_t / CLOCKS_PER_SEC) * 1000);

    size_t gblsize[1] = {memsize};
    size_t lclsize[1] = {memsize > 128? 128 : memsize};

    err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &mem_arr);
    CHECK_ERROR;
    cl_uint _size = memsize;
    err = clSetKernelArg(kernel, 1, sizeof(cl_uint), &_size);
    CHECK_ERROR;

    // BARRIER
    setup_barrier;

    err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, gblsize, lclsize, 0, NULL, &kernel_ev);
    CHECK_ERROR;

    clFinish(queue);
    clWaitForEvents(1, &kernel_ev);
    GpuLog_log(ctx->shared_info->logger, gpu_id, "kernel_inc", ts_delta, kernel_ev);
    clReleaseEvent(kernel_ev);

    // BARRIER
    setup_barrier;
    spin_wait(rw_offset);

    err = clEnqueueReadBuffer(queue, mem_arr, CL_TRUE, 0, sizeof(cl_uchar) * memsize, buffer, 0, NULL, &d2h_ev); 
    CHECK_ERROR;

    clFinish(queue);
    clWaitForEvents(1, &d2h_ev);
    GpuLog_log(ctx->shared_info->logger, gpu_id, "D2HMemcpy", ts_delta, d2h_ev);
    clReleaseEvent(d2h_ev);

    free(buffer);
    clReleaseMemObject(mem_arr);
    if (mixed_mode && gpu_id == leader_id) {
        setup_barrier;
        setup_barrier;
        setup_barrier;
    }
#undef setup_barrier
}