view example/Prime/main.cc @ 1767:1a68c05eeadf draft

minor fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 23 Nov 2013 01:28:59 +0900
parents 2dfac651288e
children
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 long prime_num = 256;			/* 素数を出力する範囲 */
static long print_flag = -1;

/* 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]);
		}
		else if (strcmp(argv[i], "-print") == 0) {
			print_flag = 0;
		}
	}
	return 0;
}

	void
prime_init(TaskManager *manager)
{

	long div_size = 256;			/* 分割するサイズ */
	long task_num = (prime_num + div_size - 1) / div_size;	/* タスクの数 */

	bool *output = (bool*)manager->allocate(sizeof(bool)*task_num*div_size); /* 判定結果を収める配列 */

	/* 出力用のタスク */
	HTask *print = manager->create_task(PrintTask);

	/* 計算したタスクの数だけタスクを生成する */
	for (long i = 0; i < task_num; i++) {

		/* 素数計算タスク */
		HTask *prime = manager->create_task(Prime);

		/* 判定結果を収める配列を渡す */
		prime->set_outData(0,&output[i*div_size],sizeof(bool)*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(bool)*prime_num);
	/* 出力する数を渡す */
	print->set_param(0,(memaddr)prime_num);
	/* printするかどうかを渡す */
	print->set_param(1,(memaddr)print_flag);
	/* 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;
}