diff example/Bulk/main.cc @ 659:c7199f162b64 draft

bulk task list start.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 23 Nov 2009 12:01:45 +0900
parents
children ecf7e09b1fe8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Bulk/main.cc	Mon Nov 23 12:01:45 2009 +0900
@@ -0,0 +1,122 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "TaskManager.h"
+#include "Func.h"
+
+extern void task_init(void);
+
+static int length = DATA_NUM;
+static int task = 1;
+static int count = 1;
+
+const char *usr_help_str = "Usage: ./twice [-length data_length] [-count task_num]\n\
+  -length  Number of data (default DATA_NUM (Func.h))\n\
+  -count   Number of task (default 1)\n";
+
+
+void
+print_data(int *data, int size, const char *title)
+{
+    printf("%s ---\n", title);
+    for (int i = 0; i < size; i++) {
+	printf("%2d ", data[i]);
+    }
+    printf("\n");
+}
+
+/**
+ * タスク終了後の data1, data2 の確認
+ */
+void
+twice_result(SchedTask *s, void *a, void *b)
+{
+    int* data = (int*)a;
+    print_data(data, length, "after");
+    free(data);
+}
+
+int
+init(int argc, char **argv)
+{
+    for (int i = 1; argv[i]; ++i) {
+        if (strcmp(argv[i], "-length") == 0) {
+            length = atoi(argv[++i]);
+        } else if (strcmp(argv[i], "-count") == 0) {
+            task = atoi(argv[++i]);
+        } else if (strcmp(argv[i], "-bluk") == 0) {
+            count = atoi(argv[++i]);
+        }
+    }
+
+    return 0;
+}
+
+void
+twice_init(TaskManager *manager)
+{
+    TaskArray *twice;
+
+    int *data = (int*)manager->allocate(sizeof(int)*length);
+
+    for (int i = 0; i < length; i++) {
+	data[i] = i;
+    }
+
+    print_data(data, length, "before");
+
+    /**
+     * Create Task
+     *   create_task(Task ID);
+     */ 
+    twice = manager->create_bulk_task(count);
+    for(int i = 0;i<count;i++) {
+	Task t = twice_main->create_stask(Twice);
+	int length2 = length/2;
+	/**
+	 * Set 32bits parameter
+	 *   add_param(32bit parameter);
+	 */
+	t->set_param(0, (memaddr)length2);
+	t->set_param(1, (memaddr)length2);
+	/**
+	 * Set of Input Data
+	 *   add_inData(address of input data, size of input data);
+	 */
+	t->add_inData(data, sizeof(int)*length2);
+	t->add_inData(data+length2, sizeof(int)*length2);
+	/**
+	 * Set of OutPut area
+	 *   add_outData(address of output area, size of output area);
+	 */
+	t->add_outData(data, sizeof(int)*length2);
+	t->add_outData(data+length2, sizeof(int)*length2);
+    }
+    twice_main->set_cpu(SPE_ANY);
+
+    /*
+     * set_post() で ppe task を渡せるようにしたい
+     */
+    twice->set_post(twice_result, (void*)data, 0);
+
+    // add Active Queue
+    twice->spawn_bulk();    
+}
+
+int
+TMmain(TaskManager *manager,int argc, char *argv[])
+{
+    if (init(argc, argv) < 0) {
+	return -1;
+    }
+
+    // Task Register
+    //   ppe/task_init.cc
+    task_init();
+
+    for (int i = 0; i < task; ++i) {
+	twice_init(manager);
+    }
+
+    return 0;
+}