diff TaskManager/test/GpuThreadTest/GpuThreads.cc @ 1440:d66dcb067c89 draft

create test program
author YuuhiTOMARI
date Mon, 23 Apr 2012 05:48:02 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/test/GpuThreadTest/GpuThreads.cc	Mon Apr 23 05:48:02 2012 +0900
@@ -0,0 +1,75 @@
+#include "GpuScheduler.h"
+#include "GpuThreads.h"
+#include "TaskManagerImpl.h"
+
+GpuThreads::GpuThreads()
+{
+    threads = new pthread_t;
+    args = new gpu_arg;
+}
+
+GpuThreads::~GpuThreads()
+{
+    delete threads;
+    delete args;
+}
+
+void
+GpuThreads::init()
+{
+    clGetPlatformIDs(1, &platfrom_id, &ret_num_platforms); 
+    clGetDeviceIds(platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, &ret_num_devices);
+
+    // unavailable GPU
+    if( ret_num_devices == 0) {
+        exit(EXIT_FAILURE);
+    }
+    context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);
+    command_queue = clCreateCommandQueue(context, device_id, 0, &ret);
+
+    args.scheduler = new GpuScheduler();
+    args.useRefDma = use_refdma;
+
+    pthread_create(&threads, NULL, &cpu_thread_run, (void*)&args);
+
+}
+
+void *
+GpuThreads::gpu_thread_run(void *args)
+{
+    gpu_arg *argt = (gpu_arg *) args;
+    Scheduler *g_scheduler = argt->scheduler;
+
+    TaskManagerImpl *manager = new GpuTaskManagerImpl();
+    g_scheduler->init(manager, argt->useRefDma);
+
+    manager->set_scheduler(g_scheduler);
+
+    g_scheduler->run();
+    g_scheduler->finish();
+
+    return NULL
+}
+
+int
+GpuThreads::get_mail(memaddr *ret)
+{
+    *ret = args.scheduler->mail_read_from_host();
+    return 1;
+}
+
+int
+GpuThreads::has_mail(memaddr *ret)
+{
+    if (args.scheduler->has_mail_from_host() != 0) {
+        return get_mail(ret);
+    } else {
+        return 0;
+    }
+}
+
+void
+CpuThreads::send_mail(int cpuid, int num, memaddr *data)
+{
+    args.scheduler->mail_write_from_host(*data);
+}