metacl 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 792d99fee2e47cc7aab8a97d71a727064b2fd081
4
- data.tar.gz: 8ca813049935f3c77ea061d4ca45f68589c3173f
3
+ metadata.gz: f78c15cdb7d30650509f1fe663a854b9ffc5d5e9
4
+ data.tar.gz: 6225085ec4af69bb79757e38fc4472f6665104c6
5
5
  SHA512:
6
- metadata.gz: 976bf50850d7d48b7c7c198275335f9d3d60d102f069f8f8c3dfd31dd14d1faaf3be3e8cbecdd42b948de5d0380442d11cbf76ae7b0b723c9f016ada9b89c52f
7
- data.tar.gz: 7c0a8940b4c4c4439ed1ffc6bc60b0d40d344ec2a4a9fe982fa168604b71e5f0708e6959c0c059fcff6b590f9178539e057e6f624747fb57ec163ce497f8856b
6
+ metadata.gz: 2073478d343372b2a74ca9448e0cbd7c4d60014c9883944f2e7e5730444140b24df908882c23478070120a18d14af0eb0868ca346d3ebf48a62628f38f7bf03c
7
+ data.tar.gz: 4c8efdd5cf387bea3f8866c29201028f631a4dbf47918d58778fe1d26b487ce1703633ca9b45ee3917ce01099fd845c25ba0913bd5547f81ec92fb5e8661a34b
data/README.md CHANGED
@@ -18,7 +18,11 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
21
+ $ metacl some.mcl
22
+
23
+ Translates some.mcl to some.cpp. Example compile command for OS X (also you must have cl.hpp in OpenCL folder):
24
+
25
+ $ clang++ -framework OpenCL -stdlib=libc++ -std=gnu++11 some.cpp
22
26
 
23
27
  ## Contributing
24
28
 
@@ -2,4 +2,5 @@ require 'metacl/dsl/expression'
2
2
  require 'metacl/dsl/data_definitions'
3
3
  require 'metacl/dsl/directs'
4
4
  require 'metacl/dsl/expression_applicator'
5
+ require 'metacl/dsl/gpu_transer'
5
6
  require 'metacl/dsl/root'
@@ -1,10 +1,19 @@
1
1
  module MetaCL
2
2
  module DSL
3
3
  class ExpressionApplicator
4
- attr_reader :code
4
+ @@counter = 0
5
+ attr_reader :code, :init_code
5
6
 
6
7
  def initialize(program, expr, result_matrix, options = {})
7
- @program, @expr = program, expr.deep_clone
8
+ @@counter += 1
9
+ @program = program
10
+ @expr = if expr.kind_of? Logic::Node
11
+ expr.deep_clone
12
+ elsif expr.kind_of? Symbol
13
+ Logic::Node.new :data, nil, nil, name: expr
14
+ elsif expr.kind_of? Numeric
15
+ Logic::Node.new :const, nil, nil, data: expr
16
+ end
8
17
  @result_matrix = program.resources.matrices_hash[result_matrix]
9
18
 
10
19
  @left_border = options[:from] || [0, 0]
@@ -15,11 +24,17 @@ module MetaCL
15
24
  prepare_tree
16
25
  code_generation
17
26
 
18
- @code = Templates::ExpressionApplicatorWrapper.render(@left_border, @right_border, @expr.params.code || '', @expr.objects, @result_matrix, @program.platform)
27
+ @init_code = if @program.platform == :cl
28
+ Templates::KernelInit.render(@left_border, @right_border, @expr.params.code || '', @result_matrix, @expr.objects, @@counter, @program.platform)
29
+ else
30
+ ''
31
+ end
32
+ @code = Templates::ExpressionApplicatorWrapper.render(@left_border, @right_border, @expr.params.code || '', @expr.objects, @result_matrix, @@counter, @program.platform)
19
33
  end
20
34
 
21
35
  def self.construct(program, expr, result_matrix, options = {})
22
- ExpressionApplicator.new(program, expr, result_matrix, options).code
36
+ e = ExpressionApplicator.new(program, expr, result_matrix, options)
37
+ [e.code, e.init_code]
23
38
  end
24
39
 
25
40
  def prepare_tree
@@ -85,6 +100,7 @@ module MetaCL
85
100
  end
86
101
  end
87
102
 
103
+ @expr.params.code ||= ''
88
104
  @expr.params.code += "#{@result_matrix.name}[i*#{@result_matrix.size_m} + j] = #{@expr.params.var};\n"
89
105
  end
90
106
  end
@@ -0,0 +1,21 @@
1
+ module MetaCL
2
+ module DSL
3
+ module GPUTransfers
4
+ def upload_to_gpu(*args)
5
+ args.each do |name|
6
+ object = @program.resources[name]
7
+ @inner_code << Templates::UploadToGPU.render(object, @program.platform)
8
+ end
9
+ @inner_code << "\n"
10
+ end
11
+
12
+ def download_from_gpu(*args)
13
+ args.each do |name|
14
+ object = @program.resources[name]
15
+ @inner_code << Templates::DownloadFromGPU.render(object, @program.platform)
16
+ end
17
+ @inner_code << "\n"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -5,18 +5,20 @@ module MetaCL
5
5
 
6
6
  include Directs
7
7
  include DataDefinitions
8
+ include GPUTransfers
8
9
 
9
10
  using Refinements
10
11
 
11
12
  def initialize(program, filename)
12
13
  @program = program
13
14
  super() # call initializers from modules
14
- @inner_code = ""
15
- @outer_code = ""
15
+ @inner_code = ""
16
+ @post_init_code = ""
17
+ @outer_code = ""
16
18
 
17
19
  instance_eval IO.read(filename), filename
18
20
 
19
- @code = Templates::Wrapper.render(@inner_code, @outer_code, @program.platform)
21
+ @code = Templates::Wrapper.render(@inner_code, @post_init_code, @outer_code, @program.platform)
20
22
  end
21
23
 
22
24
  def platform(name)
@@ -24,7 +26,7 @@ module MetaCL
24
26
  end
25
27
 
26
28
  def prints(string)
27
- @inner_code << Templates::Prints.render(string, @program.platform) << "\n"
29
+ @inner_code << Templates::Prints.render(string, @program.platform) << "\n\n"
28
30
  end
29
31
 
30
32
  def expression(name, *args, &block)
@@ -34,13 +36,21 @@ module MetaCL
34
36
 
35
37
  def apply_expression(matrix_name, options = {}, &block)
36
38
  expr = Expression.construct(@program, &block)
37
- @inner_code << ExpressionApplicator.construct(@program, expr, matrix_name, options) << "\n"
39
+ code, init_code = ExpressionApplicator.construct(@program, expr, matrix_name, options)
40
+ @inner_code << code << "\n\n"
41
+ @post_init_code << init_code << "\n\n"
38
42
  end
39
43
 
40
44
  def print_matrix(name)
41
45
  matrix = @program.resources.matrices_hash[name]
42
46
  @inner_code << Templates::PrintMatrix.render(matrix.name, matrix.size_n, matrix.size_m, @program.platform)
43
47
  end
48
+
49
+ def repeat(count, &block)
50
+ @inner_code << Templates::Iterate.render(count) << "\n"
51
+ instance_eval(&block)
52
+ @inner_code << "}\n\n"
53
+ end
44
54
  end
45
55
  end
46
56
  end
@@ -6,4 +6,8 @@ require 'metacl/templates/init_matrix'
6
6
  require 'metacl/templates/kernel'
7
7
  require 'metacl/templates/expression_applicator_wrapper'
8
8
  require 'metacl/templates/print_matrix'
9
- require 'metacl/templates/aggregator'
9
+ require 'metacl/templates/aggregator'
10
+ require 'metacl/templates/upload_to_gpu'
11
+ require 'metacl/templates/download_from_gpu'
12
+ require 'metacl/templates/kernel_init'
13
+ require 'metacl/templates/iterate'
@@ -0,0 +1,14 @@
1
+ module MetaCL
2
+ module Templates
3
+ class DownloadFromGPU < Mustache
4
+
5
+ def render(object, platform)
6
+ if platform == :cl
7
+ "queue.enqueueReadBuffer(buffer_#{object.name},CL_TRUE,0,sizeof(#{object.type})*#{object.size_n}*#{object.size_m},#{object.name}.data());\n"
8
+ else
9
+ ""
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,21 +1 @@
1
- std::string kernel_code =
2
- {{{kernel_code}}}
3
-
4
- sources.push_back({kernel_code.c_str(),kernel_code.length()});
5
-
6
- cl::Program program(context,sources);
7
- if(program.build({default_device})!=CL_SUCCESS){
8
- std::cout<<" Error building: "<<program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(default_device)<<"\n";
9
- exit(1);
10
- }
11
-
12
- //create queue to which we will push commands for the device.
13
- cl::CommandQueue queue(context,default_device);
14
-
15
- {{{push_buffers}}}
16
-
17
- auto metacl_program = cl::make_kernel<{{{template_params}}}>(program, "metacl_program");
18
- cl::EnqueueArgs eargs(queue, cl::NullRange, cl::NDRange({{n_to}} - {{n_from}}, {{m_to}} - {{m_from}}), cl::NullRange);
19
- metacl_program(eargs, {{{kernel_params}}}).wait();
20
-
21
- {{{pop_buffer}}}
1
+ metacl_program{{counter}}(eargs{{counter}}, {{{kernel_params}}}).wait();
@@ -2,54 +2,23 @@ module MetaCL
2
2
  module Templates
3
3
  class ExpressionApplicatorWrapper < Mustache
4
4
  attr_reader :n_from, :n_to, :m_from, :m_to, :code
5
- attr_reader :kernel_code, :push_buffers, :template_params, :kernel_params, :pop_buffer
5
+ attr_reader :kernel_params, :counter
6
6
 
7
- def render(from_border, to_border, code, objects, result_object, platform)
7
+ def render(from_border, to_border, code, objects, result_object, counter, platform)
8
8
  @n_from, @m_from = from_border
9
9
  @n_to, @m_to = to_border
10
- @code = Utils.tab_text(code, platform == :cl ? 1 : 2)
11
10
  @objects = objects
12
11
  @result_object = result_object
12
+ @code = Utils.tab_text(code, platform == :cl ? 1 : 2)
13
+ @counter = counter
13
14
 
14
15
  if platform == :cl
15
- gen_push_buffers
16
- gen_template_params
17
16
  gen_kernel_params
18
- gen_pop_buffer
19
- gen_kernel_code
20
17
  end
21
18
 
22
19
  super IO.read("#{__dir__}/expression_applicator_wrapper.#{platform}.template")
23
20
  end
24
21
 
25
- def gen_push_buffers
26
- @push_buffers = ""
27
- @objects.each do |x|
28
- case x.klass
29
- when :matrix
30
- @push_buffers << "queue.enqueueWriteBuffer(buffer_#{x.name},CL_TRUE,0,sizeof(#{x.type})*#{x.size_n}*#{x.size_m},#{x.name}.data());\n"
31
- when :array
32
- @push_buffers << "queue.enqueueWriteBuffer(buffer_#{x.name},CL_TRUE,0,sizeof(#{x.type})*#{x.length},#{x.name}.data());\n"
33
- when :numeric
34
- # TODO: @push_buffers << "queue.enqueueWriteBuffer(buffer_#{x.name},CL_TRUE,0,sizeof(#{x.type}),#{x.name};\n"
35
- end
36
- end
37
- end
38
-
39
- def gen_template_params
40
- params = []
41
- @objects.each do |x|
42
- case x.klass
43
- when :matrix, :array
44
- params << "cl::Buffer&"
45
- when :numeric
46
- # TODO
47
- end
48
- end
49
- params << "cl::Buffer&" # for result
50
- @template_params = params.join(', ')
51
- end
52
-
53
22
  def gen_kernel_params
54
23
  params = []
55
24
  @objects.each do |x|
@@ -64,27 +33,6 @@ module MetaCL
64
33
  params << "buffer_#{@result_object.name}"
65
34
  @kernel_params = params.join(', ')
66
35
  end
67
-
68
- def gen_pop_buffer
69
- x = @result_object
70
- @pop_buffer = "queue.enqueueReadBuffer(buffer_#{x.name},CL_TRUE,0,sizeof(#{x.type})*#{x.size_n}*#{x.size_m},#{x.name}.data());\n"
71
- end
72
-
73
- def gen_kernel_code
74
- params = []
75
- @objects.each do |x|
76
- case x.klass
77
- when :matrix, :array
78
- params << "global const #{x.type}* #{x.name}"
79
- when :numeric
80
- # TODO
81
- end
82
- end
83
- params << "global #{@result_object.type}* #{@result_object.name}"
84
-
85
- @kernel_code = Templates::Kernel.render(params.join(', '), @code, @n_from, @m_from)
86
- @kernel_code = Utils.stringify_text(@kernel_code)
87
- end
88
36
  end
89
37
  end
90
38
  end
@@ -0,0 +1 @@
1
+ for (int iterator{{counter}} = 0; iterator{{counter}} < {{repeats}}; ++iterator{{counter}}) {
@@ -0,0 +1,16 @@
1
+ module MetaCL
2
+ module Templates
3
+ class Iterate < Mustache
4
+ @@counter = 0
5
+ attr_reader :counter, :repeats
6
+
7
+ def render(repeats)
8
+ @@counter += 1
9
+ @counter = @@counter
10
+ @repeats = repeats
11
+ #@code = Utils.tab_text(code, 1)
12
+ super IO.read("#{__dir__}/iterate.any.template")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,4 +1,4 @@
1
- void kernel metacl_program({{{params}}}) {
1
+ void kernel metacl_program{{counter}}({{{params}}}) {
2
2
  int i = get_global_id(0) + {{n_from}};
3
3
  int j = get_global_id(1) + {{m_from}};
4
4
  {{{code}}}
@@ -1,9 +1,10 @@
1
1
  module MetaCL
2
2
  module Templates
3
3
  class Kernel < Mustache
4
- attr_reader :params, :code, :n_from, :m_from
4
+ attr_reader :params, :code, :n_from, :m_from, :counter
5
5
 
6
- def render(params, code, n_from, m_from)
6
+ def render(params, code, n_from, m_from, counter)
7
+ @counter = counter
7
8
  @params, @code = params, code
8
9
  @n_from, @m_from = n_from, m_from
9
10
  super IO.read("#{__dir__}/kernel.cl.template")
@@ -0,0 +1,16 @@
1
+ cl::Program::Sources sources{{counter}};
2
+
3
+ std::string kernel_code{{counter}} =
4
+ {{{kernel_code}}}
5
+
6
+ sources{{counter}}.push_back({kernel_code{{counter}}.c_str(),kernel_code{{counter}}.length()});
7
+
8
+ cl::Program program{{counter}}(context,sources{{counter}});
9
+ if(program{{counter}}.build({default_device})!=CL_SUCCESS){
10
+ std::cout<<" Error building: "<<program{{counter}}.getBuildInfo<CL_PROGRAM_BUILD_LOG>(default_device)<<"\n";
11
+ exit(1);
12
+ }
13
+
14
+ auto metacl_program{{counter}} = cl::make_kernel<{{{template_params}}}>(program{{counter}}, "metacl_program{{counter}}");
15
+
16
+ cl::EnqueueArgs eargs{{counter}}(queue, cl::NullRange, cl::NDRange({{n_to}} - {{n_from}}, {{m_to}} - {{m_from}}), cl::NullRange);
@@ -0,0 +1,51 @@
1
+ module MetaCL
2
+ module Templates
3
+ class KernelInit < Mustache
4
+ attr_reader :counter, :kernel_code, :n_from, :m_from, :n_to, :m_to, :template_params
5
+
6
+ def render(from_border, to_border, code, result_object, objects, counter, platform)
7
+ if platform == :cl
8
+ @counter = counter
9
+ @code = Utils.tab_text(code, 1)
10
+ @result_object = result_object
11
+ @objects = objects
12
+ @n_from, @m_from = from_border
13
+ @n_to, @m_to = to_border
14
+ gen_kernel_code
15
+ gen_template_params
16
+ super IO.read("#{__dir__}/kernel_init.cl.template")
17
+ end
18
+ end
19
+
20
+ def gen_kernel_code
21
+ params = []
22
+ @objects.each do |x|
23
+ case x.klass
24
+ when :matrix, :array
25
+ params << "global const #{x.type}* #{x.name}"
26
+ when :numeric
27
+ # TODO
28
+ end
29
+ end
30
+ params << "global #{@result_object.type}* #{@result_object.name}"
31
+
32
+ @kernel_code = Templates::Kernel.render(params.join(', '), @code, @n_from, @m_from, @counter)
33
+ @kernel_code = Utils.stringify_text(@kernel_code)
34
+ end
35
+
36
+ def gen_template_params
37
+ params = []
38
+ @objects.each do |x|
39
+ case x.klass
40
+ when :matrix, :array
41
+ params << "cl::Buffer&"
42
+ when :numeric
43
+ # TODO
44
+ end
45
+ end
46
+ params << "cl::Buffer&" # for result
47
+ @template_params = params.join(', ')
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,20 @@
1
+ module MetaCL
2
+ module Templates
3
+ class UploadToGPU < Mustache
4
+
5
+ def render(object, platform)
6
+ if platform == :cl
7
+ case object.klass
8
+ when :matrix
9
+ @result = "queue.enqueueWriteBuffer(buffer_#{object.name},CL_TRUE,0,sizeof(#{object.type})*#{object.size_n}*#{object.size_m},#{object.name}.data());\n"
10
+ when :array
11
+ @result = "queue.enqueueWriteBuffer(buffer_#{object.name},CL_TRUE,0,sizeof(#{object.type})*#{object.length},#{object.name}.data());\n"
12
+ when :numeric
13
+ # TODO: @push_buffers << "queue.enqueueWriteBuffer(buffer_#{x.name},CL_TRUE,0,sizeof(#{x.type}),#{x.name};\n"
14
+ end
15
+ end
16
+ @result || ''
17
+ end
18
+ end
19
+ end
20
+ end
@@ -31,7 +31,10 @@ int main(){
31
31
 
32
32
  cl::Context context({default_device});
33
33
 
34
- cl::Program::Sources sources;
34
+ //create queue to which we will push commands for the device.
35
+ cl::CommandQueue queue(context,default_device);
36
+
37
+ {{{post_init_code}}}
35
38
 
36
39
  {{{inner_code}}}
37
40
 
@@ -5,6 +5,7 @@
5
5
 
6
6
  int main()
7
7
  {
8
+ {{{post_init_code}}}
8
9
  {{{inner_code}}}
9
10
  return 0;
10
11
  }
@@ -1,10 +1,10 @@
1
1
  module MetaCL
2
2
  module Templates
3
3
  class Wrapper < Mustache
4
- attr_accessor :inner_code, :outer_code
4
+ attr_accessor :inner_code, :outer_code, :post_init_code
5
5
 
6
- def render(inner_code, outer_code, platform)
7
- @inner_code, @outer_code = Utils.tab_text(inner_code), outer_code
6
+ def render(inner_code, post_init_code, outer_code, platform)
7
+ @inner_code, @post_init_code, @outer_code = Utils.tab_text(inner_code), Utils.tab_text(post_init_code), outer_code
8
8
  super IO.read("#{__dir__}/wrapper.#{platform}.template")
9
9
  end
10
10
  end
@@ -1,3 +1,3 @@
1
1
  module MetaCL
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metacl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Kolesnev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-25 00:00:00.000000000 Z
11
+ date: 2014-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mustache
@@ -101,6 +101,7 @@ files:
101
101
  - lib/metacl/dsl/directs.rb
102
102
  - lib/metacl/dsl/expression.rb
103
103
  - lib/metacl/dsl/expression_applicator.rb
104
+ - lib/metacl/dsl/gpu_transer.rb
104
105
  - lib/metacl/dsl/root.rb
105
106
  - lib/metacl/logic.rb
106
107
  - lib/metacl/logic/node.rb
@@ -110,6 +111,7 @@ files:
110
111
  - lib/metacl/templates.rb
111
112
  - lib/metacl/templates/aggregator.any.template
112
113
  - lib/metacl/templates/aggregator.rb
114
+ - lib/metacl/templates/download_from_gpu.rb
113
115
  - lib/metacl/templates/expression_applicator_wrapper.cl.template
114
116
  - lib/metacl/templates/expression_applicator_wrapper.cpp.template
115
117
  - lib/metacl/templates/expression_applicator_wrapper.rb
@@ -122,12 +124,17 @@ files:
122
124
  - lib/metacl/templates/init_numeric.cl.template
123
125
  - lib/metacl/templates/init_numeric.cpp.template
124
126
  - lib/metacl/templates/init_numeric.rb
127
+ - lib/metacl/templates/iterate.any.template
128
+ - lib/metacl/templates/iterate.rb
125
129
  - lib/metacl/templates/kernel.cl.template
126
130
  - lib/metacl/templates/kernel.rb
131
+ - lib/metacl/templates/kernel_init.cl.template
132
+ - lib/metacl/templates/kernel_init.rb
127
133
  - lib/metacl/templates/print_matrix.any.template
128
134
  - lib/metacl/templates/print_matrix.rb
129
135
  - lib/metacl/templates/prints.any.template
130
136
  - lib/metacl/templates/prints.rb
137
+ - lib/metacl/templates/upload_to_gpu.rb
131
138
  - lib/metacl/templates/wrapper.cl.template
132
139
  - lib/metacl/templates/wrapper.cpp.template
133
140
  - lib/metacl/templates/wrapper.rb