metacl 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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