1440
|
1 #include "GpuScheduler.h"
|
|
2 #include "GpuThreads.h"
|
|
3 #include "TaskManagerImpl.h"
|
|
4
|
|
5 GpuThreads::GpuThreads()
|
|
6 {
|
|
7 threads = new pthread_t;
|
|
8 args = new gpu_arg;
|
|
9 }
|
|
10
|
|
11 GpuThreads::~GpuThreads()
|
|
12 {
|
|
13 delete threads;
|
|
14 delete args;
|
|
15 }
|
|
16
|
|
17 void
|
|
18 GpuThreads::init()
|
|
19 {
|
|
20 clGetPlatformIDs(1, &platfrom_id, &ret_num_platforms);
|
|
21 clGetDeviceIds(platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, &ret_num_devices);
|
|
22
|
|
23 // unavailable GPU
|
|
24 if( ret_num_devices == 0) {
|
|
25 exit(EXIT_FAILURE);
|
|
26 }
|
|
27 context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);
|
|
28 command_queue = clCreateCommandQueue(context, device_id, 0, &ret);
|
|
29
|
|
30 args.scheduler = new GpuScheduler();
|
|
31 args.useRefDma = use_refdma;
|
|
32
|
|
33 pthread_create(&threads, NULL, &cpu_thread_run, (void*)&args);
|
|
34
|
|
35 }
|
|
36
|
|
37 void *
|
|
38 GpuThreads::gpu_thread_run(void *args)
|
|
39 {
|
|
40 gpu_arg *argt = (gpu_arg *) args;
|
|
41 Scheduler *g_scheduler = argt->scheduler;
|
|
42
|
|
43 TaskManagerImpl *manager = new GpuTaskManagerImpl();
|
|
44 g_scheduler->init(manager, argt->useRefDma);
|
|
45
|
|
46 manager->set_scheduler(g_scheduler);
|
|
47
|
|
48 g_scheduler->run();
|
|
49 g_scheduler->finish();
|
|
50
|
|
51 return NULL
|
|
52 }
|
|
53
|
|
54 int
|
|
55 GpuThreads::get_mail(memaddr *ret)
|
|
56 {
|
|
57 *ret = args.scheduler->mail_read_from_host();
|
|
58 return 1;
|
|
59 }
|
|
60
|
|
61 int
|
|
62 GpuThreads::has_mail(memaddr *ret)
|
|
63 {
|
|
64 if (args.scheduler->has_mail_from_host() != 0) {
|
|
65 return get_mail(ret);
|
|
66 } else {
|
|
67 return 0;
|
|
68 }
|
|
69 }
|
|
70
|
|
71 void
|
|
72 CpuThreads::send_mail(int cpuid, int num, memaddr *data)
|
|
73 {
|
|
74 args.scheduler->mail_write_from_host(*data);
|
|
75 }
|