view spe/SpeSentry.cc @ 2:1e1b0d280427

commit
author yutaka@localhost.localdomain
date Wed, 07 Apr 2010 05:18:52 +0900
parents dcd83cefb980
children 8b4d6bf8c43d
line wrap: on
line source

#include <stdio.h>
#include <malloc.h>
#include <spu_intrinsics.h>
#include <spu_mfcio.h>
#include "SpeSentry.h"
#include "MailCommand.h"
#include "Dma.h"
#include "Run.h"

void*
fix_type(task_t *task, void* buff)
{

  char *p;
  p = (char*)buff;
  p = p + sizeof(task_head_t);

  task->head = (task_head_t*)buff;
  task->input = p;

}

void*
allocate(int size)
{

  int alignment = 16;
  return memalign(alignment, size);

}

task_t
task_allocate(int size)
{

  if (size % 16) {
    //printf("allocate size is not multiple of 16\n");
  }

  char *buff;
  task_t task;

  void *head;
  head = memalign(16, size);

  buff = (char*)head;
  buff = buff + sizeof(task_head_t);

  task.head = (task_head_t*)head;
  task.input = buff;

  return task;

}

int
main(unsigned long long spe, unsigned long long argp, unsigned long long envp)
{

  uint32_t data;
  int buff_num = 2;
  unsigned int dma_wait_time = 0;

  int in_tag[buff_num];
  int out_tag[buff_num];

  in_tag[0] = 0;
  in_tag[1] = 1;

  out_tag[0] = 2;
  out_tag[1] = 3;

  int head_tag = 4;

  task_head_t *head   = (task_head_t*)allocate(sizeof(task_head_t));
  task_t *send_params = (task_t*)allocate(sizeof(task_t));
  void *input_buff[buff_num];
  void *output_buff[buff_num];

  int cur;

  spu_write_out_mbox(WANT_DATA);

  while(1) {

    //mail check start
    if(spu_stat_in_mbox()) {

      data = spu_read_in_mbox();
      
      if (data == SPE_RUN_END) {

	break;

      } else {

	//printf("[SPE] data %p\n",data);

	dma_get(head, data, sizeof(task_head_t), head_tag);
	dma_wait_time += dma_wait(head_tag);

	input_buff[0] = allocate(head->next_task_size);

	dma_get(input_buff[0], head->next_task, head->next_task_size, in_tag[0]);
	dma_wait_time += dma_wait(in_tag[0]);

	fix_type(send_params,input_buff[0]);

	cur = 0;

	while(1) {

	  input_buff[cur^1] = allocate(send_params->head->next_task_size);	      
	  dma_get(input_buff[cur^1], send_params->head->next_task, send_params->head->next_task_size, in_tag[cur^1]);
	  
	  void *in  = send_params->input;

	  //printf("hoge");
	  output_buff[cur] = allocate(send_params->head->size_out);
	  int data_length = send_params->head->size_out;

	  
	  //task********************************************
	  
	  run(in,output_buff[cur],data_length);
	  
	  //end*********************************************
	  
	  dma_put(output_buff[cur], send_params->head->ea_out, send_params->head->size_out, out_tag[cur]);

	  free(input_buff[cur]);

	  dma_wait_time += dma_wait(in_tag[cur^1]);
	  dma_wait_time += dma_wait(out_tag[cur^1]);
	  //printf("hoge");

	  free(output_buff[cur^1]);

	  cur ^= 1;

	  fix_type(send_params,input_buff[cur]);

	  if ((unsigned long)send_params->head->next_task == 0) {
	    break;
	  }
	
	}//while
 

	  void *in  = send_params->input;

	  //printf("hoge");
	  output_buff[cur] = allocate(send_params->head->size_out);
	  int data_length = send_params->head->size_out;

	  
	  //task********************************************
	  
	  run(in,output_buff[cur],data_length);
	  
	  //end*********************************************
	  
	  dma_put(output_buff[cur], send_params->head->ea_out, send_params->head->size_out, out_tag[cur]);

	  free(input_buff[cur]);

	  dma_wait_time += dma_wait(out_tag[cur] | out_tag[cur^1] );
	  free(output_buff[cur]);
	  free(output_buff[cur^1]);

	  spu_write_out_mbox(WANT_DATA);
	  //printf("[SPE] send mail\n");
	  
      }//if
    }//if
    //mail check end


  }//while

  printf("dma_wait_time %d\n",dma_wait_time);

  return 0;

}


/*end*/