Mercurial > hg > Game > Cerium
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); +}