Mercurial > hg > Game > Cerium
view example/Prime/main.cc @ 1171:d910c8377a09 draft
add prime example
author | Daichi TOMA <amothic@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 04 Jun 2011 17:26:14 +0900 |
parents | |
children | 7909536bf611 |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "TaskManager.h" #include "Func.h" /* task_initを宣言 */ extern void task_init(void); /* TaskManagerを宣言 */ extern TaskManager *manager; static int prime_num = 256; /* 素数を出力する範囲 */ /* help文章 */ const char *usr_help_str = "Usage: ./prime [-cpu spe_num] [-num N]\n\ -cpu Number of SPE (default 1) \n\ -num Print of Prime scope (default 256) "; int init(int argc, char **argv) { for (int i = 1; argv[i]; ++i) { if (strcmp(argv[i], "-num") == 0) { prime_num = atoi(argv[++i]); } } return 0; } void prime_init(TaskManager *manager) { int div_size = 256; /* 分割するサイズ */ int task_num = (prime_num + div_size - 1) / div_size; /* タスクの数 */ int *output = (int*)manager->allocate(sizeof(int)*task_num*div_size); /* 判定結果を収める配列 */ /* 出力用のタスク */ HTask *print = manager->create_task(PrintTask); /* 計算したタスクの数だけタスクを生成する */ for (int i = 0; i < task_num; i++) { /* 素数計算タスク */ HTask *prime = manager->create_task(Prime); /* 判定結果を収める配列を渡す */ prime->set_outData(0,&output[i*div_size],sizeof(int)*div_size); /* SPEを順に使う */ prime->set_cpu(SPE_ANY); /* 素数判定の範囲を渡す */ prime->set_param(0,(memaddr)(i*div_size)); /* 開始地点 */ prime->set_param(1,(memaddr)((i+1)*div_size)); /* 終了地点 */ /* 出力用タスクの依存関係 */ print->wait_for(prime); /* タスクを登録 */ prime->spawn(); } /* 出力用のタスクに判定結果を収めた配列を渡す */ print->set_inData(0,output,sizeof(int)*prime_num); /* 出力する数を渡す */ print->set_param(0,(memaddr)prime_num); /* PPEを使うように指示 */ print->set_cpu(CPU_PPE); /* タスクを登録 */ print->spawn(); } int TMmain(TaskManager *manager, int argc, char *argv[]) { if (init(argc, argv) < 0) { return -1; } task_init(); prime_init(manager); return 0; }