Exemplo n.º 1
0
int main (int argc, char** argv)
{ 
  int ps = 1;
  pthread_t pt[ps];
  int size = 1*1024*1024/ps;
  int i,j;
  double ss, ee;

  ss = get_dtime();
  for (j = 0; j < 10; j++) {
    size = size << 1;
    for (i = 0; i < ps; i++) {
      pthread_create(&pt[i], NULL, memlock, &size);
      pthread_join(pt[i], NULL);
    }
  }

  for (i = 0; i < ps; i++) {
    pthread_join(pt[i], NULL);
  }
  ee = get_dtime();

  fprintf(stderr, "Total size: %d, Time: %f\n", ps* (size/(1024*1024)), ee - ss);

}
Exemplo n.º 2
0
Arquivo: io.c Projeto: Guo-astro/FDPS
void output_data(FILE *fp, int n, REAL tim, struct Energy *energies, struct Step *step)
{
  step->tf = get_dtime();
  fprintf(stderr, "Time: %9.3f\n", tim);
  fprintf(fp, "Time: %9.3f\n", tim);
  fprintf(fp, "---Energy----------------------------------------------------------------------\n");
  fprintf(fp, "tot: %.8f ", energies->e);
  fprintf(fp, "w: %.8f k: %.8f ", energies->ew, energies->ek);
  fprintf(fp, "de: %+.3e de/|e|: %+.3e\n", energies->e - energies->ei, (energies->e - energies->ei) / (- energies->ei));
  fprintf(fp, "---Time------------------------------------------------------------------------\n");
  fprintf(fp, "tcalc: %.2e", step->tf - step->tb);
  fprintf(fp, " %.2e Gflops", (REAL)step->step * (REAL)n * OPERATION / (step->tf - step->tb) * 1e-9);
#if 0
  fprintf(fp, " niave: %.2e\n", (REAL)step->step / (REAL)step->blck);
#else
  fprintf(fp, " niave: %.2e", (REAL)step->step / (REAL)step->blck);
  fprintf(fp, " %e\n", (REAL)step->step);
#endif
  fprintf(fp, "\n");
  fflush(fp);
  step->tb   = get_dtime();
  step->step = 0;
  step->blck = 0;
  return;
}
Exemplo n.º 3
0
int main( int argc, char** argv) {
    printf("start emps.\n");
    RdDat();
    AlcBkt();
    SetPara();

    double timer_sta = get_dtime();

    ClcEMPS();

    double timer_end = get_dtime();
    printf("Total        : %13.6lf sec\n",timer_end -timer_sta);


    free(Acc);
    free(Pos);
    free(Vel);
    free(Prs);
    free(pav);
    free(Typ);
    free(bfst);
    free(blst);
    free(nxt);
    printf("end emps.\n");
    return 0;
}
Exemplo n.º 4
0
int x_wait_for_last_refresh(double _w)
{
	
	if (_w<0.0) 
	{
		// on est trop lent : ca a pris plus d'une 1/60ieme de seconde pour construire la frame
		return 0 ; 
	}
		
#ifdef DRIVER_IOS
	extern int x_frame_rate;
	if (x_frame_rate==60 && g_video_offscreen_has_been_modified && !x_vbl_count)
#else
	if (g_video_offscreen_has_been_modified && !x_vbl_count)
#endif
	{
		while(!x_vbl_count && !r_sim65816.should_emulator_terminate()) micro_sleep(0.01);
		x_vbl_count--;
	}
	else
	{
		if(_w>0.0) 
		{
			double s = get_dtime();
			if (_w>0.01)
				micro_sleep(_w);
			// sur windows le micro_sleep est lÈgËrement en retard!
			while( get_dtime() < s+_w);
		}
	}

	return 0;
}
Exemplo n.º 5
0
int RDMA_transfer(char* src, char* dst, int buf_size, int count, struct RDMA_communicator *comm) 
{
  int i;
  int fd;
  int read_size;
  int tag;
  int ctl_msg_size;
  struct file_buffer *fbufs;
  int fbuf_index = 0;
  int *flags;
  char ctl_msg[1536];
  double e,s;

  fbufs = (struct file_buffer *)malloc(sizeof(struct file_buffer) * count);
  flags = (int *)malloc(sizeof(int) * count);
  for (i = 0; i < count; i++) {
    fbufs[i % count].buf =  (char *)malloc(buf_size);
    flags[i % count] = 1;
  }

  /*send init*/
  tag=get_tag();
  sprintf(ctl_msg, "%d\t%s", tag, dst);
  //printf(ctl_msg);
  ctl_msg_size =  strlen(ctl_msg);
  RDMA_Sendr(ctl_msg, ctl_msg_size, TRANSFER_INIT, comm);
  /*---------*/

  /*send file*/
  fd = open(src, O_RDONLY);
  //  printf("read fbuf_index=%d\n", fbuf_index);
  read_size = buf_read(fd, fbufs[fbuf_index].buf, buf_size);

  do {
    //    printf("sent fbuf_index=%d\n", fbuf_index);

    RDMA_Isendr(fbufs[fbuf_index].buf, read_size, tag, &flags[fbuf_index], comm);
    //flags[fbuf_index] = 1;
    //    printf("... sent done\n");
    //    printf("read fbuf_index=%d\n", fbuf_index);
    s = get_dtime();
    read_size = buf_read(fd, fbufs[(fbuf_index + 1) % count].buf, buf_size);
    e = get_dtime();
    //    printf("ACT lib: read time = %fsecs, read size = %d MB, throughput = %f MB/s\n", e - s, read_size/1000000, read_size/(e - s)/1000000.0);
    RDMA_Wait (&flags[fbuf_index]);

    fbuf_index = (fbuf_index + 1) % count;
  } while (read_size > 0);
  /*---------*/

  /*send fin*/
  sprintf(ctl_msg, "%d\t%s", tag, dst);
  ctl_msg_size =  strlen(ctl_msg);
  RDMA_Sendr(ctl_msg, ctl_msg_size, TRANSFER_FIN, comm);
  /*---------*/
  

  return 0;
}
Exemplo n.º 6
0
int main (int argc, char *argv[])
{
  int fd;
  int i;
  void *memfile;
  struct stat statbuf;
  double d0, d1;
  int count;

  printf("Page size:%d\n", getpagesize());

  if ((fd = open(argv[1],O_RDONLY)) < 0){
    printf("can't open\n");
  }
  
  if (fstat(fd,&statbuf) < 0){
    printf("fstat error\n");
  }
  
  printf("mmap...");
  memfile=mmap(0,statbuf.st_size,PROT_READ,MAP_SHARED,fd,0);
  printf("done\n");
  printf("mlock...");
  mlock(memfile, statbuf.st_size);
  printf("done\n");

  printf("search1 ...");
  d0 = get_dtime();
  for (i=0; i<statbuf.st_size; i++){
    char *cs = memfile;
    char c = cs[i];
    if (c=='a') {
      count++;
    }
  }
  d1 = get_dtime();
  printf("done:%f (%d)\n", d1 - d0, count);
  
  count=0;

  printf("search2 ...");
  d0 = get_dtime();
  for (i=0; i<statbuf.st_size; i++){
    char *cs = memfile;
    char c = cs[i];
    if (c=='a') {
      count++;
    }
  }
  d1 = get_dtime();
  printf("done:%f (%d)\n", d1 - d0, count);


}
Exemplo n.º 7
0
Arquivo: timer.c Projeto: r-mite/time
int main(){
	double d0, d1;
	d0 = get_dtime();
	int i;
	for(i=0; i<100; i++){
		printf("t\n");
	}
	d1 = get_dtime();
	printf("elapsed: %f", d1 - d0);
	printf("hello\n");	
return 0;
}
Exemplo n.º 8
0
Arquivo: nbcr.c Projeto: kento/libnbcr
int nbcr_checkpoint(nbcr_comm *comm, unsigned long gen)
{
  void* ckpt;
  int checkpoint = 0;
  double ts;

  comm->perfc->gen = gen;
  ts = get_dtime();
  comm->perfc->tp = ts - comm->perfc->ts;
  comm->perfc->ts  = ts;
  if (comm->on_ckpt) {
    int status;
    status = RDMA_Trywait(&(comm->req));
    if (status != 0) {
      checkpoint = 2;
      fprintf(stderr, "Checkpoint start\n");
    } 
    checkpoint = 0;
    //fprintf(stderr, "Checkpoint still is on going\n");
  } else {
    checkpoint = 1;
    fprintf(stderr, "First checkpoint start\n");
  }
  if (checkpoint > 0) {
    comm->ckpt_info->gen = gen;
    //memcpy(comm->ckpt, comm->data, comm->ckpt_info->size);
    RDMA_Isend(comm->ckpt_info, sizeof(nbcr_perfc) + sizeof(nbcr_ckpt_info) + comm->ckpt_info->size, NULL, -1, NBCR_CKPT_TAG, &(comm->comm), &(comm->req));
    comm->on_ckpt = 1;
  }
  return checkpoint;  
}
Exemplo n.º 9
0
Arquivo: read.c Projeto: kento/Samples
int main(int argc, char** argv){
  FILE *fp;
  char str[PSIZE];
  double d0, d1;
  int i;
  int count;

  if ((fp = fopen(argv[1],"r")) < 0) {
    printf("can't open file");
    return -1;
  }

  printf("search1 ...");
  d0 = get_dtime();
  while((fgets(str,PSIZE,fp)) != NULL) {
    printf("%s\n",str);
    for (i=0; i<PSIZE; i++){
      if (str[i]=='a') {
	printf("a");
	count++;
      }
    }
  }
  d1 = get_dtime();
  printf("done: %f (%d)\n",d1 - d0, count);

  count=0;
  rewind(fp);

  printf("search2 ...");
  d0 = get_dtime();
  while((fgets(str,PSIZE,fp)) != NULL) {
    for (i=0; i<PSIZE; i++){
      if (str[i]=='a') {
	count++;
      }
    }
  }
  d1 = get_dtime();
  printf("done: %f (%d)\n",d1 - d0, count);

  fclose(fp);
  return 0;
}
Exemplo n.º 10
0
void __pc_ibv_post_send(struct ibv_qp *qp, struct ibv_send_wr *wr,
                      struct ibv_send_wr **bad_wr)
{

  struct pc_hca *hca;
  uint16_t lid;
  double s, e;
  s = get_dtime();
  if (init_hcas_q == 0) {
     return;
  }
  if (wr->opcode == IBV_WR_RDMA_WRITE)
    {
      lid = get_lid(qp->context);
      hca = get_pc_hca(lid);

      if (hca == NULL) {
	return ;
      }

      struct pc_length *len = (struct pc_length*)malloc(sizeof(struct pc_length));

      len->ctx = qp->context;
      len->length = wr->sg_list->length;
      lq_enq(&pc_q, len);
      
      pthread_mutex_lock(&pc_mutex);
      hca->co->pdg_num++;
      hca->co->pdg_size += wr->sg_list->length;
      pthread_mutex_unlock(&pc_mutex);

#ifdef DEBUG
      fprintf(stderr, "[ %f ] post_send : pdg_num: %lu , pdg_size: %lu\n", get_dtime(), hca->co->pdg_num, hca->co->pdg_size);
#ifdef DETAIL
      fprintf(stderr, "\tqp:%p, send_cq: %p, recv_cq: %p, context: %p, qp_context: %p\n", qp, qp->send_cq, qp->recv_cq, qp->context, qp->qp_context);
      fprintf(stderr, "\twr_id:%lu, length:%d, opcode:%d, send_flags%d, imm_data:%u, remote_add:%lu, rkey:%u, xrc_remote_srq_num:%u\n", wr->wr_id, wr->sg_list->length, wr->opcode, wr->send_flags, wr->imm_data, wr->wr.rdma.remote_addr, wr->wr.rdma.rkey, wr->xrc_remote_srq_num);
      fprintf(stderr, "\ttime:%f\n", get_dtime() - s);
#endif
#endif
    }

  return;
}
Exemplo n.º 11
0
Arquivo: nbcr.c Projeto: kento/libnbcr
int nbcr_nn_end(nbcr_comm *comm)
{
  double ts, tp;
  ts = get_dtime();
  tp = ts - comm->perfc->ts_nn;

  if (comm->perfc->tp_nn > tp) {
    comm->perfc->tp_nn = tp;
  }
  return 0;
}
Exemplo n.º 12
0
void* memlock(void* size)
{ 
  int* s;
  char* a;
  double ss,ee;
  int i;

  s = (int *)size;
  a = (char *)valloc(*s);
  //  printf("%d \n", sizeof(a));
  //  memset(a, 0, *s);

  //  for (i = 0; i < *s; i++) {
  //      a[i] = 'x';
  //  }

  ss = get_dtime();
  mlock(a,*s);
  ee = get_dtime();
  fprintf(stderr, "Size: %d, Time: %f\n", *s, ee - ss);
  return;
}
Exemplo n.º 13
0
int TEST_RDMA_transfer (char* host, char* src, char* dst) 
{
  //  uint64_t size;
  //  int flag1, flag2;
  struct  RDMA_communicator comm;
  struct  RDMA_param param;

  double st, et;
  int i;

  param.host = host;

  RDMA_Active_Init(&comm, &param);
  st = get_dtime();
  for (i = 0; i < 12; i++){
    char path[1024];
    sprintf(path, "%s.%d", dst, i);
    RDMA_transfer(src, path, 200000000, 2, &comm);
  }
  et = get_dtime();
  printf("ACT: Total time= %f\n", et - st);
  //  RDMA_Active_Finalize(&comm);
  return 0;
}
Exemplo n.º 14
0
void __pc_ibv_poll_cq(struct ibv_cq *cq, int num_entries, struct ibv_wc *wc)
{

  struct pc_length *len;

  if (init_hcas_q == 0) {
    return;
  }
  if (wc->opcode == IBV_WC_RDMA_WRITE) {
      lq_init_it(&pc_q);

      while ((len = (struct pc_length*)lq_next(&pc_q)) != NULL) {
	struct pc_hca *hca;
	uint16_t lid;
	if (len->ctx == cq->context) {
	  lid = get_lid(cq->context);
	  hca = get_pc_hca(lid);

	  pthread_mutex_lock(&pc_mutex);
	  hca->co->pdg_num--;
	  hca->co->pdg_size = hca->co->pdg_size - len->length;
	  pthread_mutex_unlock(&pc_mutex);

	  lq_remove(&pc_q, len);
	  free(len);
	  lq_fin_it(&pc_q);

#ifdef DEBUG
	  	  fprintf(stderr, "[ %f ] post_cq   : pdg_num: %lu , pdg_size: %lu \n", get_dtime(), hca->co->pdg_num, hca->co->pdg_size);
#ifdef DETAIL
	  	  struct ibv_port_attr pattr;
	  	  ibv_query_port(cq->context, 1, &pattr);
	  	  fprintf(stderr, "\tcp:%p, context:%p(more_ops:%p, abi_compat:%p, num_comp_vectors:%d, slid:%u), :\n", cq, cq->context, cq->context->more_ops, cq->context->abi_compat, cq->context->num_comp_vectors, pattr.lid);
	  	  fprintf(stderr, "\twr_id:%lu, status:%d, wc->opcode:%d, vendor_err:%u, byte_len:%u, imm_data:%u, qp_num:%p src_qp:%p, wc_flags:%d,  pkey_index:%u, slid:%u, sl:%u, dlid_path_bits:%u, num_entries:%d \n", wc->wr_id,  wc->status, wc->opcode, wc->vendor_err, wc->byte_len, wc->imm_data, wc->qp_num, wc->src_qp, wc->wc_flags, wc->pkey_index, wc->slid, wc->sl, wc->dlid_path_bits, num_entries);
#endif
#endif
	  return;
	}
      }
      lq_fin_it(&pc_q);
  }
  return;
}
Exemplo n.º 15
0
Arquivo: nbcr.c Projeto: kento/libnbcr
int nbcr_nn_start(nbcr_comm *comm)
{
  comm->perfc->ts_nn = get_dtime();
  return 0;
}
Exemplo n.º 16
0
void play_hmi (void * arg)
{
	int i;
	int pos = 0x308;
	int n_chunks = 0;
	int low_dtime;
	int low_chunk;
	int csec;
//	pid_t loc_pid;
	int qid;
	int ipc_read = 0;
	int k=0;
	
	struct msgbuf *rcv;
	
	Track_info *t_info;

	//printf ("play_hmi\n");//#########
	
	stop = 0;
	ipc_read=0;
//	loc_pid=fork();
    
/*	switch (loc_pid)
	{
	 case 0:
		break;
	 case -1:
		return -1;
	 default:
		atexit(kill_ipc);
		return loc_pid;
	}*/
	
//	signal(SIGTERM, my_quit);
	rcv=d_malloc(sizeof(long) + 16);
	
	rcv->mtype=1;
	rcv->mtext[0]='0';
	
	sleep(2);
	
	qid=msgget ((key_t) ('l'<<24) | ('d'<<16) | ('e'<<8) | 's', 0660);
	if(qid == -1)
	{	
		return;
	}
	
	do
	{
		ipc_read=do_ipc(qid,rcv,0);
	}
	while(rcv->mtext[0] != 'p');
	
	stop=0;
	rcv->mtext[0] = '0';
	
	seq_init();
	
	n_chunks=data[0x30];
	
	t_info = d_malloc(sizeof(Track_info)*n_chunks);
	
	while(1)
	{
		
		for(i=0;i<n_chunks;i++)
		{
			t_info[i].position = pos + 12;
			t_info[i].status = PLAYING;
			t_info[i].time = get_dtime(data,&t_info[i].position);
			pos += (( (0xff & data[pos + 5]) << 8 ) + (0xff & data[pos + 4]);
		}
		
		SEQ_START_TIMER();
		do
		{
			low_chunk = -1;
			k++;
			i=0;
			do
			{
				if (t_info[i].status == PLAYING)
				  low_chunk = i;
				i++;
			}
			while((low_chunk <=0) && (i<n_chunks);
			
			if (low_chunk == -1)
			  break;
			
			low_dtime = t_info[low_chunk].time;
			
			for(i=1;i<n_chunks;i++)
			{
				if ((t_info[i].time < low_dtime) && 
				    (t_info[i].status == PLAYING))
				{
					low_dtime = t_info[i].time;
					low_chunk = i;
				}
			}
			
			//if (low_dtime < 0)
			  //printf("Serious warning: d_time negative!!!!!!\n");
			
			csec = 0.86 * low_dtime;
			
			//flush sequencer buffer after 20 events
			if (k == 20)
			{
				ioctl(seqfd, SNDCTL_SEQ_SYNC);
				k = 0;
			}
			
			SEQ_WAIT_TIME(csec);
			
			t_info[low_chunk].status = do_track_event(data,&t_info[low_chunk].position);
			
			if (t_info[low_chunk].status == 3)
			{
				//printf("Error playing data in chunk %d\n",low_chunk);
				t_info[low_chunk].status = STOPPED;
			}
			
			if (t_info[low_chunk].status == PLAYING)
			  t_info[low_chunk].time += get_dtime(data,&t_info[low_chunk].position);
			
			//Check if the song has reached the end
			stop = t_info[0].status;
			for(i=1;i<n_chunks;i++)
			  stop &= t_info[i].status;
			
			if((do_ipc(qid,rcv,IPC_NOWAIT) > 0) && (rcv->mtext[0]=='p'))
			{
				n_chunks=data[0x30];
				t_info = realloc(t_info,sizeof(Track_info)*n_chunks);
				stop = 1;
				rcv->mtext[0] = '0';  
				stop_all();
			}
		}
		while(!stop);
		SEQ_STOP_TIMER();
		if( stop == 2)
		{
			stop_all();	    
			do
			{
				ipc_read=do_ipc(qid,rcv,0);
			}
			while(rcv->mtext[0] != 'p');
			rcv->mtext[0] = '0';
			n_chunks=data[0x30];
			t_info = realloc(t_info,sizeof(Track_info)*n_chunks);
			stop = 0;
		}
		pos=0x308;
	}
	d_free(data);
	d_free(t_info);
	d_free(rcv);
	
}
Exemplo n.º 17
0
static int run(void)
{
    struct rdma_addrinfo hints, *res;
    struct ibv_qp_init_attr attr;
    struct ibv_wc wc;
    int ret;

    memset(&hints, 0, sizeof hints);
    hints.ai_port_space = RDMA_PS_TCP;
    ret = rdma_getaddrinfo(server, port, &hints, &res);
    if (ret) {
        printf("rdma_getaddrinfo %d\n", errno);
        return ret;
    }

    memset(&attr, 0, sizeof attr);
    attr.cap.max_send_wr = attr.cap.max_recv_wr = 1;
    attr.cap.max_send_sge = attr.cap.max_recv_sge = 1;
    attr.cap.max_inline_data = 16;
    attr.qp_context = id;
    attr.sq_sig_all = 1;
    ret = rdma_create_ep(&id, res, NULL, &attr);
    rdma_freeaddrinfo(res);
    if (ret) {
        printf("rdma_create_ep %d\n", errno);
        return ret;
    }

    mr = rdma_reg_msgs(id, recv_msg, 16);
    if (!mr) {
        printf("rdma_reg_msgs %d\n", errno);
        return ret;
    }

    ret = rdma_post_recv(id, NULL, recv_msg, 16, mr);
    if (ret) {
        printf("rdma_post_recv %d\n", errno);
        return ret;
    }

    ret = rdma_connect(id, NULL);
    if (ret) {
        printf("rdma_connect %d\n", errno);
        return ret;
    }

    s = get_dtime();
    ret = rdma_post_send(id, NULL, send_msg, 16, NULL, IBV_SEND_INLINE);
    if (ret) {
        printf("rdma_post_send %d\n", errno);
        return ret;
    }
    e = get_dtime();
    ret = rdma_get_recv_comp(id, &wc);
    if (ret <= 0) {
        printf("rdma_get_recv_comp %d\n", ret);
        return ret;
    }

    printf("time %f\n", e - s);

    rdma_disconnect(id);
    rdma_dereg_mr(mr);
    rdma_destroy_ep(id);
    return 0;
}
Exemplo n.º 18
0
void on_completion(struct ibv_wc *wc)
{
  struct connection *conn = (struct connection *)(uintptr_t)wc->wr_id;

  if (wc->status != IBV_WC_SUCCESS)
    die("on_completion: status is not IBV_WC_SUCCESS.");

  if (wc->opcode == IBV_WC_RDMA_WRITE) {
    e[idx] = get_dtime();
    int *v = (int*)conn->rdma_local_region;
    printf("RDMA Write: %f (v=%d)\n", e[idx] - s[idx], v[0]);
    idx++;
    return;
  } else if (wc->opcode & IBV_WC_RDMA_READ) {
    //    printf("RDMA Read: %f\n", e - s);
    return;
  }

  if (wc->opcode & IBV_WC_RECV) {
    conn->recv_state++;

    if (conn->recv_msg->type == MSG_MR) {
      memcpy(&conn->peer_mr, &conn->recv_msg->data.mr, sizeof(conn->peer_mr));
      post_receives(conn); /* only rearm for MSG_MR */

      if (conn->send_state == SS_INIT) /* received peer's MR before sending ours, so send ours back */
        send_mr(conn);
    }

  } else {
    conn->send_state++;
    printf("send completed successfully.\n");
  }

  if (conn->send_state == SS_MR_SENT && conn->recv_state == RS_MR_RECV) {
    struct ibv_send_wr wr, *bad_wr = NULL;
    struct ibv_sge sge;

    if (s_mode == M_WRITE)
      printf("received MSG_MR. writing message to remote memory...\n");
    else
      printf("received MSG_MR. reading message from remote memory...\n");

    memset(&wr, 0, sizeof(wr));

    wr.wr_id = (uintptr_t)conn;
    wr.opcode = (s_mode == M_WRITE) ? IBV_WR_RDMA_WRITE : IBV_WR_RDMA_READ;
    wr.sg_list = &sge;
    wr.num_sge = 1;
    wr.send_flags = IBV_SEND_SIGNALED;
    wr.wr.rdma.remote_addr = (uintptr_t)conn->peer_mr.addr;
    wr.wr.rdma.rkey = conn->peer_mr.rkey;

    sge.addr = (uintptr_t)conn->rdma_local_region;
    sge.length = RDMA_BUFFER_SIZE;
    sge.lkey = conn->rdma_local_mr->lkey;

    

    int *v = (int*)conn->peer_mr.addr;
    v[0] = 15;
    int i;
    for (i = 0; i < CNUM; i++) {
      s[i] = get_dtime();
      TEST_NZ(ibv_post_send(conn->qp, &wr, &bad_wr));
    }
    v[0] = 11;    

    conn->send_msg->type = MSG_DONE;
    send_message(conn);

  } else if (conn->send_state == SS_DONE_SENT && conn->recv_state == RS_DONE_RECV) {
    printf("remote buffer: %s\n", get_peer_message_region(conn));
    rdma_disconnect(conn->id);
  }
}
Exemplo n.º 19
0
//static void* poll_cq(struct RDMA_communicator* comm)
static void* poll_cq(struct poll_cq_args* args)
{
  struct ibv_cq *cq;
  struct ibv_wc wc;
  struct connection *conn;
  struct RDMA_communicator *comm;
  //  struct RDMA_message *msg;
  double s, e;
  char* ip;

  struct control_msg cmsg;
  void* ctx;
  char* buff; 
  uint64_t buff_size;
  int tag;

  uint64_t mr_size=0;
  uint64_t sent_size=0;
  char* send_base_addr;

  int* flag = args->flag;
  int mr_index;

  //for (i = 0; i < RDMA_BUF_NUM_C; i++){ rdma_msg_mr[i] = NULL;}
  
  comm = args->comm;
  buff = args->msg->buff;
  send_base_addr = args->msg->buff;
  buff_size= args->msg->size;
  tag= args->msg->tag;

  cmsg.type=MR_INIT;
  cmsg.data1.buff_size=buff_size;
  send_control_msg(comm->cm_id->context, &cmsg);
  //  fprintf(stderr, "RDMA lib: SEND: INIT: tag=%d\n", tag);
  post_receives(comm->cm_id->context);
  s = get_dtime();
  while (1) {
    if (ibv_get_cq_event(s_ctx->comp_channel, &cq, &ctx)) {
      fprintf(stderr, "RDMA lib: SEND: ERROR: get cq event  failed @ %s:%d", __FILE__, __LINE__);
      exit(1);
    }
    ibv_ack_cq_events(cq, 1);
    if (ibv_req_notify_cq(cq, 0)) {
      fprintf(stderr, "RDMA lib: SEND: ERROR: request notification failed @ %s:%d", __FILE__, __LINE__);
      exit(1);
    }

    while (ibv_poll_cq(cq, 1, &wc)){
      conn = (struct connection *)(uintptr_t)wc.wr_id;
      debug(printf("Control MSG from: %lu\n", (uintptr_t)conn->id), 1);
      if (wc.status != IBV_WC_SUCCESS) {
        die("RDMA lib: SEND: ERROR: on_completion: status is not IBV_WC_SUCCESS.");
      }

      if (wc.opcode == IBV_WC_RECV) {
        switch (conn->recv_msg->type)
          {
          case MR_INIT_ACK:
	    debug(printf("Recived: Type=%d\n",  conn->recv_msg->type), 1);
	    for (mr_index = 0; mr_index < RDMA_BUF_NUM_C; mr_index++) {
	      debug(printf("Recived: Type=%d\n",  conn->recv_msg->type), 1);
	      if (sent_size == buff_size) {
		/*sent all data*/
		cmsg.type=MR_FIN;
		cmsg.data1.tag=tag;
		send_control_msg(conn, &cmsg);
		//		fprintf(stderr,"Yahoooooooooo !!\n");
		post_receives(conn);
		debug(printf("RDMA lib: SEND: Recieved MR_INIT_ACK: for tag=%d\n",  tag), 1);
	      } else {
		debug(printf("RDMA lib: SEND: Recieved MR_INIT_ACK: for tag=%d\n",  tag), 1);
		/*not sent all data yet*/
		if (sent_size + rdma_buf_size > buff_size) {
		  mr_size = buff_size - sent_size;
		} else {
		  mr_size = rdma_buf_size;
		}
		debug(printf("mr_size=%lu\n", mr_size),1);
		//	      printf("%s\n", send_base_addr);
		//	      register_rdma_region(conn, send_base_addr, mr_size);
		
		register_rdma_msg_mr(mr_index, send_base_addr, mr_size);
		send_base_addr += mr_size;
		sent_size += mr_size;
		
		cmsg.type=MR_CHUNK;
		cmsg.data1.mr_size=mr_size;
		memcpy(&cmsg.data.mr, rdma_msg_mr[mr_index], sizeof(struct ibv_mr));
		//	      cmsg.data.mr = conn->rdma_msg_mr;
		send_control_msg(conn, &cmsg);
		//		fprintf(stderr, "RDMA lib: SEND: CHUNK: tag=%d\n", tag);
		post_receives(conn);
	      }
	    }
            break;
          case MR_CHUNK_ACK:

	    if (sent_size == buff_size) {
              /*sent all data*/
	      cmsg.type=MR_FIN;
	      cmsg.data1.tag=tag;
	      debug(printf("RDMA lib: SEND: Recieved MR_CHUNK_ACK => FIN: for tag=%d\n",  tag), 1);
	    } else {
              /*not sent all data yet*/
	      debug(printf("RDMA lib: SEND: Recieved MR_CHUNK_ACK: for tag=%d\n",  tag), 1);
	      if (sent_size + rdma_buf_size > buff_size) {
		mr_size = buff_size - sent_size;
	      } else {
		mr_size = rdma_buf_size;
	      }
	      debug(printf("mr_size=%lu\n", mr_size),1);
	      //	      printf("%s\n", send_base_addr);
	      //	      register_rdma_region(conn, send_base_addr, mr_size);
	      //	      mr_index = (mr_index+ 1) % RDMA_BUF_NUM_C;
	      mr_index = (mr_index+ 1) % RDMA_BUF_NUM_C;
	      debug(printf("mr_index=%d\n", mr_index),1);
	      register_rdma_msg_mr(mr_index, send_base_addr, mr_size);
	      send_base_addr += mr_size;

	      sent_size += mr_size;
	      cmsg.type=MR_CHUNK;
	      cmsg.data1.mr_size=mr_size;
	      memcpy(&cmsg.data.mr, rdma_msg_mr[mr_index], sizeof(struct ibv_mr));
	      //	      cmsg.data.mr = conn->rdma_msg_mr;
	    }
	    send_control_msg(conn, &cmsg);
	    //	    fprintf(stderr, "RDMA lib: SEND: CHUNK2: tag=%d, slid=%lu\n", tag, (uintptr_t)wc.slid);
	    post_receives(conn);
            break;
          case MR_FIN_ACK:
            debug(printf("Recived: Type=%d\n",  conn->recv_msg->type),1);
	    *flag = 1;
	    // rdma_disconnect(comm->cm_id);
	    // rdma_disconnect(conn->id);
	    //exit(0);
	    e = get_dtime();
	    free(args->msg);
	    free(args);
	    //	    fprintf(stderr, "RDMA lib: SEND: FIN_ACK: tag=%d\n", tag);
	    //ip = get_ip_addr("ib0");
	    //	    printf("RDMA lib: SEND: %s: send time= %f secs, send size= %lu MB, throughput = %f MB/s\n", ip, e - s, buff_size/1000000, buff_size/(e - s)/1000000.0);
	    return NULL;
          default:
            debug(printf("Unknown TYPE"), 1);
	    return NULL;
          }
      } else if (wc.opcode == IBV_WC_SEND) {
	//	fprintf(stderr, "RDMA lib: SENT: DONE: tag=%d\n", tag);
	debug(printf("RDMA lib: SEND: Sent: TYPE=%d, tag=%d\n", conn->send_msg->type, tag),1);
      } else {
	  die("unknow opecode.");
      }
    }
  }
  return NULL;
}
Exemplo n.º 20
0
void play_hmi (void * arg)
{
	int i;
	int pos = 0x308;
	int n_chunks = 0;
	int low_dtime;
	int low_chunk;
	int csec, lcsec;
	int qid;
	int ipc_read = 0;
	int k=0;

	struct msgbuf *rcv;

	Track_info *t_info;

	con_printf(CON_DEBUG,"play_hmi\n");

	stop = 0;
	ipc_read=0;

	rcv=malloc(sizeof(long) + 16);

	rcv->mtype=1;
	rcv->mtext[0]='0';

	qid=msgget ((key_t) ('l'<<24) | ('d'<<16) | ('e'<<8) | 's', 0660);
	if(qid == -1)
	{
		return;
	}

	do
	{
		ipc_read=do_ipc(qid,rcv,0);
	}
	while(rcv->mtext[0] != 'p');

	stop=0;
	rcv->mtext[0] = '0';

	seq_init();

	n_chunks=data[0x30];

	t_info = malloc(sizeof(Track_info)*n_chunks);

	while(1)
	{

		for(i=0;i<n_chunks;i++)
		{
			t_info[i].position = pos + 12;
			t_info[i].status = PLAYING;
			t_info[i].time = get_dtime(data,&t_info[i].position);
			pos += (( (0xff & data[pos + 5]) << 8 ) + (0xff & data[pos + 4]));
		}

		lcsec = 0;

		SEQ_START_TIMER();
		do
		{
			low_chunk = -1;
			k++;
			i=0;
			do
			{
				if (t_info[i].status == PLAYING)
				  low_chunk = i;
				i++;
			}
			while((low_chunk <=0) && (i<n_chunks));

			if (low_chunk == -1)
			  break;

			low_dtime = t_info[low_chunk].time;

			for(i=1;i<n_chunks;i++)
			{
				if ((t_info[i].time < low_dtime) &&
				    (t_info[i].status == PLAYING))
				{
					low_dtime = t_info[i].time;
					low_chunk = i;
				}
			}

			if (low_dtime < 0)
			  con_printf(CON_URGENT,"Serious warning: d_time negative!!!!!!\n");

			csec = 0.86 * low_dtime;

			//flush sequencer buffer after 20 events
			if (k == 20)
			{
				ioctl(seqfd, SNDCTL_SEQ_SYNC);
				k = 0;
			}

#ifdef WANT_AWE32
			cut_trough();
#endif

			if (csec != lcsec) {
				SEQ_WAIT_TIME(csec);
			}

			lcsec = csec;

			t_info[low_chunk].status = do_track_event(data,&t_info[low_chunk].position);

			if (t_info[low_chunk].status == 3)
			{
				con_printf(CON_URGENT,"Error playing data in chunk %d\n",low_chunk);
				t_info[low_chunk].status = STOPPED;
			}

			if (t_info[low_chunk].status == PLAYING)
			  t_info[low_chunk].time += get_dtime(data,&t_info[low_chunk].position);

			//Check if the song has reached the end
			stop = t_info[0].status;
			for(i=1;i<n_chunks;i++)
			  stop &= t_info[i].status;

			if((do_ipc(qid,rcv,IPC_NOWAIT) > 0) && (rcv->mtext[0]=='p'))
			{
				n_chunks=data[0x30];
				t_info = realloc(t_info,sizeof(Track_info)*n_chunks);
				stop = 1;
				rcv->mtext[0] = '0';
				stop_all();
			}
		}
		while(!stop);
		SEQ_STOP_TIMER();
		if( stop == 2)
		{
			stop_all();
			do
			{
				ipc_read=do_ipc(qid,rcv,0);
			}
			while(rcv->mtext[0] != 'p');
			rcv->mtext[0] = '0';
			n_chunks=data[0x30];
			t_info = realloc(t_info,sizeof(Track_info)*n_chunks);
			stop = 0;
		}
		pos=0x308;
	}
	free(data);
	free(t_info);
	free(rcv);

}
Exemplo n.º 21
0
int RDMA_file_transfer(char* src, char* dst, int buf_size, int count) 
{
  int i;
  int fd;
  int read_size;
  int tag;
  int ctl_msg_size;
  struct file_buffer *fbufs;
  int fbuf_index = 0;
  int *flags;
  int flag_init=0;
  char ctl_msg[1536];

  double e,s;
  int send_buf = 0;

  s = get_dtime();

  fbufs = (struct file_buffer *)malloc(sizeof(struct file_buffer) * count);
  flags = (int *)malloc(sizeof(int) * count);
  for (i = 0; i < count; i++) {
    fbufs[i % count].buf =  (char *)malloc(buf_size);
    flags[i % count] = 1;
  }

  //  fprintf(stderr, "ACT lib: SEND: %d: src=%s dst=%s \n", file_send_count, src, dst);

  /*send init*/
  tag=get_tag();
  sprintf(ctl_msg, "%d\t%s\t", tag, dst);
  //  fprintf(stderr, "ACT lib: SEND: %d: ctlmsg=%s\n", file_send_count,  ctl_msg);
  file_send_count++;
  //printf(ctl_msg);
  ctl_msg_size =  strlen(ctl_msg);
  flag_init = 0;
  RDMA_Isendr(ctl_msg, ctl_msg_size, TRANSFER_INIT, &flag_init, &rdma_comm);
  //  fprintf(stderr, "ACT lib: SEND: %d: DONE ctlmsg=%s\n", file_send_count,  ctl_msg);
 
 /*---------*/
  /*send file*/
  fd = open(src, O_RDONLY);
  read_size = buf_read(fd, fbufs[fbuf_index].buf, buf_size);

  RDMA_Wait (&flag_init);
 

  do {
    //    printf("sent fbuf_index=%d\n", fbuf_index);
    //    fprintf(stderr, "ACT lib: SEND: Befor RDNA Isendr call: ctlmsg=%s\n", ctl_msg);
    flags[fbuf_index] = 0;
    RDMA_Isendr(fbufs[fbuf_index].buf, read_size, tag, &flags[fbuf_index], &rdma_comm);
    send_buf += read_size;
    //    fprintf(stderr, "ACT lib: SEND: After RDNA Isendr call: ctlmsg=%s\n", ctl_msg);
    //flags[fbuf_index] = 1;
    //    printf("... sent done\n");

    read_size = buf_read(fd, fbufs[(fbuf_index + 1) % count].buf, buf_size);

    //    fprintf(stderr, "ACT lib: SEND: read time = %f secs, read size = %f MB, throughput = %f MB/s: ctlmsg=%s\n", e - s, read_size/1000000.0, read_size/(e - s)/1000000.0, ctl_msg);
    //fprintf(stderr, "ACT lib: SEND: Before wait: ctlmsg=%s\n",  ctl_msg);
    RDMA_Wait (&flags[fbuf_index]);
    //    fprintf(stderr, "ACT lib: SEND: After wait: ctlmsg=%s\n",  ctl_msg);
    fbuf_index = (fbuf_index + 1) % count;
  } while (read_size > 0);

  /*---------*/

  /*send fin*/

  sprintf(ctl_msg, "%d\t%s", tag, dst);
  ctl_msg_size =  strlen(ctl_msg);
  RDMA_Sendr(ctl_msg, ctl_msg_size, TRANSFER_FIN, &rdma_comm);
  /*---------*/
  close(fd);
  for (i = 0; i < count; i++) {
    free(fbufs[i % count].buf);
  }
  free(flags);
  free(fbufs);

  e = get_dtime();
  //  fprintf(stderr, "ACT lib: SEND: file send: Time= %f , size= %d \n",  e - s, send_buf);

  return 0;
}