sgc-ruby-cuda 0.1.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.
Files changed (64) hide show
  1. data/.yardopts +2 -0
  2. data/COPYING +674 -0
  3. data/README.rdoc +106 -0
  4. data/Rakefile +76 -0
  5. data/doc/devel.rdoc +77 -0
  6. data/doc/features.rdoc +55 -0
  7. data/lib/cuda/driver/context.rb +236 -0
  8. data/lib/cuda/driver/cu.rb +60 -0
  9. data/lib/cuda/driver/device.rb +155 -0
  10. data/lib/cuda/driver/deviceptr.rb +69 -0
  11. data/lib/cuda/driver/error.rb +182 -0
  12. data/lib/cuda/driver/event.rb +124 -0
  13. data/lib/cuda/driver/ffi-cu.rb +620 -0
  14. data/lib/cuda/driver/function.rb +293 -0
  15. data/lib/cuda/driver/init.rb +45 -0
  16. data/lib/cuda/driver/memory.rb +134 -0
  17. data/lib/cuda/driver/module.rb +142 -0
  18. data/lib/cuda/driver/rubycu.rb +37 -0
  19. data/lib/cuda/driver/stream.rb +128 -0
  20. data/lib/cuda/driver/version.rb +42 -0
  21. data/lib/cuda/runtime/cuda.rb +65 -0
  22. data/lib/cuda/runtime/device.rb +175 -0
  23. data/lib/cuda/runtime/error.rb +197 -0
  24. data/lib/cuda/runtime/event.rb +117 -0
  25. data/lib/cuda/runtime/ffi-cuda.rb +588 -0
  26. data/lib/cuda/runtime/function.rb +161 -0
  27. data/lib/cuda/runtime/memory.rb +110 -0
  28. data/lib/cuda/runtime/rubycuda.rb +34 -0
  29. data/lib/cuda/runtime/stream.rb +126 -0
  30. data/lib/cuda/runtime/thread.rb +81 -0
  31. data/lib/cuda/runtime/version.rb +51 -0
  32. data/lib/ffi/prettystruct.rb +32 -0
  33. data/lib/helpers/flags.rb +82 -0
  34. data/lib/helpers/interface/ienum.rb +45 -0
  35. data/lib/helpers/klass.rb +45 -0
  36. data/lib/memory/buffer.rb +125 -0
  37. data/lib/memory/interface/ibuffer.rb +63 -0
  38. data/lib/memory/pointer.rb +72 -0
  39. data/lib/rubycu.rb +1 -0
  40. data/lib/rubycuda.rb +1 -0
  41. data/test/bad.ptx +0 -0
  42. data/test/memory/test_buffer.rb +93 -0
  43. data/test/rubycu/test_cucontext.rb +148 -0
  44. data/test/rubycu/test_cudevice.rb +69 -0
  45. data/test/rubycu/test_cudeviceptr.rb +43 -0
  46. data/test/rubycu/test_cuevent.rb +81 -0
  47. data/test/rubycu/test_cufunction.rb +165 -0
  48. data/test/rubycu/test_cumemory.rb +113 -0
  49. data/test/rubycu/test_cumodule.rb +114 -0
  50. data/test/rubycu/test_custream.rb +77 -0
  51. data/test/rubycu/test_cuversion.rb +39 -0
  52. data/test/rubycu/testbase.rb +107 -0
  53. data/test/rubycuda/test_cudadevice.rb +125 -0
  54. data/test/rubycuda/test_cudaerror.rb +48 -0
  55. data/test/rubycuda/test_cudaevent.rb +78 -0
  56. data/test/rubycuda/test_cudafunction.rb +106 -0
  57. data/test/rubycuda/test_cudamemory.rb +90 -0
  58. data/test/rubycuda/test_cudastream.rb +72 -0
  59. data/test/rubycuda/test_cudathread.rb +69 -0
  60. data/test/rubycuda/test_cudaversion.rb +41 -0
  61. data/test/rubycuda/testbase.rb +67 -0
  62. data/test/vadd.cu +21 -0
  63. data/version.rb +1 -0
  64. metadata +180 -0
@@ -0,0 +1,72 @@
1
+ #
2
+ # Copyright (c) 2010-2011 Chung Shin Yee
3
+ #
4
+ # shinyee@speedgocomputing.com
5
+ # http://www.speedgocomputing.com
6
+ # http://github.com/xman/sgc-ruby-cuda
7
+ # http://rubyforge.org/projects/rubycuda
8
+ #
9
+ # This file is part of SGC-Ruby-CUDA.
10
+ #
11
+ # SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
12
+ # it under the terms of the GNU General Public License as published by
13
+ # the Free Software Foundation, either version 3 of the License, or
14
+ # (at your option) any later version.
15
+ #
16
+ # SGC-Ruby-CUDA is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ # GNU General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU General Public License
22
+ # along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
23
+ #
24
+
25
+ require 'ffi'
26
+
27
+
28
+ module SGC
29
+ module Memory
30
+
31
+ # A memory pointer class.
32
+ class MemoryPointer
33
+
34
+ # @param [Integer] addr Memory address _addr_ to initialize to.
35
+ # @return A memory pointer pointing to address _addr_.
36
+ def initialize(addr = nil)
37
+ @p = FFI::MemoryPointer.new(:pointer)
38
+ @p.write_long(addr.to_i)
39
+ end
40
+
41
+
42
+ # @return The internal pointer representation.
43
+ def ptr
44
+ @p.read_pointer
45
+ end
46
+
47
+
48
+ # Set this pointer to point to memory address _addr_.
49
+ # @param [Integer] addr Memory address to set to.
50
+ # @return _addr_.
51
+ def ptr=(addr)
52
+ @p.write_pointer(addr)
53
+ addr
54
+ end
55
+
56
+
57
+ # @param [Integer] index Index to a memory offset.
58
+ # @return [MemoryPointer] A memory pointer pointing to the _index_ byte.
59
+ def offset(index)
60
+ MemoryPointer.new(@p.read_pointer.to_i + index)
61
+ end
62
+
63
+
64
+ # @return The internal representation of a pointer pointing to this memory pointer.
65
+ def ref
66
+ @p
67
+ end
68
+
69
+ end
70
+
71
+ end # module
72
+ end # module
@@ -0,0 +1 @@
1
+ require 'cuda/driver/rubycu'
@@ -0,0 +1 @@
1
+ require 'cuda/runtime/rubycuda'
File without changes
@@ -0,0 +1,93 @@
1
+ #-----------------------------------------------------------------------
2
+ # Copyright (c) 2010-2011 Chung Shin Yee
3
+ #
4
+ # shinyee@speedgocomputing.com
5
+ # http://www.speedgocomputing.com
6
+ # http://github.com/xman/sgc-ruby-cuda
7
+ # http://rubyforge.org/projects/rubycuda
8
+ #
9
+ # This file is part of SGC-Ruby-CUDA.
10
+ #
11
+ # SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
12
+ # it under the terms of the GNU General Public License as published by
13
+ # the Free Software Foundation, either version 3 of the License, or
14
+ # (at your option) any later version.
15
+ #
16
+ # SGC-Ruby-CUDA is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ # GNU General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU General Public License
22
+ # along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
23
+ #-----------------------------------------------------------------------
24
+
25
+ require 'test/unit'
26
+ require 'memory/buffer'
27
+
28
+ include SGC::Memory
29
+
30
+
31
+ class TestMemoryBuffer < Test::Unit::TestCase
32
+
33
+ def test_buffer_initialize
34
+ b = Buffer.new(:int, 10)
35
+ assert_instance_of(Buffer, b)
36
+ assert_equal(10, b.size)
37
+
38
+ b = Buffer.new(:long, 20)
39
+ assert_instance_of(Buffer, b)
40
+ assert_equal(20, b.size)
41
+
42
+ b = Buffer.new(:float, 30)
43
+ assert_instance_of(Buffer, b)
44
+ assert_equal(30, b.size)
45
+ end
46
+
47
+
48
+ def test_buffer_element_size
49
+ assert_equal(4, Buffer.element_size(:int))
50
+ assert_equal(4, Buffer.element_size(:float))
51
+ end
52
+
53
+
54
+ def test_buffer_offset
55
+ b = Buffer.new(:int, 16)
56
+ c = b.offset(4)
57
+ assert_kind_of(MemoryPointer, c)
58
+
59
+ b = Buffer.new(:int, 10)
60
+ c = b.offset(5)
61
+ assert_kind_of(MemoryPointer, c)
62
+
63
+ b = Buffer.new(:long, 10)
64
+ c = b.offset(3)
65
+ assert_kind_of(MemoryPointer, c)
66
+
67
+ b = Buffer.new(:float, 10)
68
+ c = b.offset(4)
69
+ assert_kind_of(MemoryPointer, c)
70
+ end
71
+
72
+
73
+ def test_buffer_access
74
+ b = Buffer.new(:int, 10)
75
+ b[0] = 10
76
+ assert_equal(10, b[0])
77
+ b[9] = 20
78
+ assert_equal(20, b[9])
79
+
80
+ b = Buffer.new(:long, 10)
81
+ b[3] = 2**40
82
+ assert_equal(2**40, b[3])
83
+ b[7] = 2**50
84
+ assert_equal(2**50, b[7])
85
+
86
+ b = Buffer.new(:float, 10)
87
+ b[2] = 3.14
88
+ assert_in_delta(3.14, b[2])
89
+ b[8] = 9.33
90
+ assert_in_delta(9.33, b[8])
91
+ end
92
+
93
+ end
@@ -0,0 +1,148 @@
1
+ #-----------------------------------------------------------------------
2
+ # Copyright (c) 2010-2011 Chung Shin Yee
3
+ #
4
+ # shinyee@speedgocomputing.com
5
+ # http://www.speedgocomputing.com
6
+ # http://github.com/xman/sgc-ruby-cuda
7
+ # http://rubyforge.org/projects/rubycuda
8
+ #
9
+ # This file is part of SGC-Ruby-CUDA.
10
+ #
11
+ # SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
12
+ # it under the terms of the GNU General Public License as published by
13
+ # the Free Software Foundation, either version 3 of the License, or
14
+ # (at your option) any later version.
15
+ #
16
+ # SGC-Ruby-CUDA is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ # GNU General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU General Public License
22
+ # along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
23
+ #-----------------------------------------------------------------------
24
+
25
+ require 'test/unit'
26
+ require_relative 'testbase'
27
+
28
+
29
+ class TestCUContext < Test::Unit::TestCase
30
+
31
+ include CUTestBase
32
+
33
+
34
+ def test_context_create_destroy
35
+ c = CUContext.create(@dev)
36
+ assert_instance_of(CUContext, c)
37
+ c = c.destroy
38
+ assert_nil(c)
39
+ c = CUContext.create(0, @dev)
40
+ assert_instance_of(CUContext, c)
41
+ c = c.destroy
42
+ assert_nil(c)
43
+ CUContextFlags.symbols.each do |k|
44
+ c = CUContext.create(k, @dev)
45
+ assert_instance_of(CUContext, c)
46
+ c = c.destroy
47
+ assert_nil(c)
48
+ end
49
+ end
50
+
51
+
52
+ def test_context_current
53
+ c = CUContext.current
54
+ assert_instance_of(CUContext, c)
55
+ CUContext.current = c
56
+ end
57
+
58
+
59
+ def test_context_attach_detach
60
+ c1 = @ctx.attach(0)
61
+ assert_instance_of(CUContext, c1)
62
+ c2 = @ctx.detach
63
+ assert_nil(c2)
64
+ end
65
+
66
+
67
+ def test_context_attach_nonzero_flags_detach
68
+ assert_raise(CUInvalidValueError) do
69
+ c1 = @ctx.attach(999)
70
+ assert_instance_of(CUContext, c1)
71
+ c2 = @ctx.detach
72
+ assert_nil(c2)
73
+ end
74
+ end
75
+
76
+
77
+ def test_context_push_pop_current
78
+ c1 = CUContext.pop_current
79
+ assert_instance_of(CUContext, c1)
80
+ c2 = @ctx.push_current
81
+ assert_instance_of(CUContext, c2)
82
+ end
83
+
84
+
85
+ def test_context_get_device
86
+ d = CUContext.device
87
+ assert_device(d)
88
+ end
89
+
90
+
91
+ def test_context_get_set_limit
92
+ if @dev.compute_capability[:major] >= 2
93
+ assert_limit = Proc.new { |&b| assert_nothing_raised(&b) }
94
+ else
95
+ assert_limit = Proc.new { |&b| assert_raise(CUUnsupportedLimitError, &b) }
96
+ end
97
+ assert_limit.call do
98
+ stack_size = CUContext.limit(:STACK_SIZE)
99
+ assert_kind_of(Integer, stack_size)
100
+ fifo_size = CUContext.limit(:PRINTF_FIFO_SIZE)
101
+ assert_kind_of(Integer, fifo_size)
102
+ heap_size = CUContext.limit(:MALLOC_HEAP_SIZE)
103
+ assert_kind_of(Integer, heap_size)
104
+ CUContext.limit = [:STACK_SIZE, stack_size]
105
+ s = CUContext.limit(:STACK_SIZE)
106
+ assert_equal(stack_size, s)
107
+ CUContext.limit = [:PRINTF_FIFO_SIZE, fifo_size]
108
+ s = CUContext.limit(:PRINTF_FIFO_SIZE)
109
+ assert_equal(fifo_size, s)
110
+ CUContext.limit = :MALLOC_HEAP_SIZE, heap_size
111
+ s = CUContext.limit(:MALLOC_HEAP_SIZE)
112
+ assert_equal(heap_size, s)
113
+ end
114
+ end
115
+
116
+
117
+ def test_context_get_set_cache_config
118
+ if @dev.compute_capability[:major] >= 2
119
+ config = CUContext.cache_config
120
+ assert_not_nil(CUFunctionCache[config])
121
+ CUContext.cache_config = config
122
+ c = CUContext.cache_config
123
+ assert_equal(config, c)
124
+ else
125
+ config = CUContext.cache_config
126
+ assert_equal(:PREFER_NONE, config)
127
+ CUContext.cache_config = config
128
+ c = CUContext.cache_config
129
+ assert_equal(:PREFER_NONE, c)
130
+ end
131
+ end
132
+
133
+
134
+ def test_context_get_api_version
135
+ v1 = @ctx.api_version
136
+ v2 = CUContext.api_version
137
+ assert_kind_of(Integer, v1)
138
+ assert_kind_of(Integer, v2)
139
+ assert(v1 == v2)
140
+ end
141
+
142
+
143
+ def test_context_synchronize
144
+ s = CUContext.synchronize
145
+ assert_nil(s)
146
+ end
147
+
148
+ end
@@ -0,0 +1,69 @@
1
+ #-----------------------------------------------------------------------
2
+ # Copyright (c) 2010-2011 Chung Shin Yee
3
+ #
4
+ # shinyee@speedgocomputing.com
5
+ # http://www.speedgocomputing.com
6
+ # http://github.com/xman/sgc-ruby-cuda
7
+ # http://rubyforge.org/projects/rubycuda
8
+ #
9
+ # This file is part of SGC-Ruby-CUDA.
10
+ #
11
+ # SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
12
+ # it under the terms of the GNU General Public License as published by
13
+ # the Free Software Foundation, either version 3 of the License, or
14
+ # (at your option) any later version.
15
+ #
16
+ # SGC-Ruby-CUDA is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ # GNU General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU General Public License
22
+ # along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
23
+ #-----------------------------------------------------------------------
24
+
25
+ require 'test/unit'
26
+ require_relative 'testbase'
27
+
28
+
29
+ class TestCUDevice < Test::Unit::TestCase
30
+
31
+ include CUTestBase
32
+
33
+
34
+ def test_device_count
35
+ count = CUDevice.count
36
+ assert(count > 0, "Device count failed.")
37
+ end
38
+
39
+
40
+ def test_device_query
41
+ d = @dev
42
+ assert_instance_of(CUDevice, d)
43
+ assert_device_name(d)
44
+ assert_device_memory_size(d)
45
+ assert_device_capability(d)
46
+ assert_device_properties(d)
47
+ CUDeviceAttribute.symbols.each do |k|
48
+ v = d.attribute(k)
49
+ assert_instance_of(Fixnum, v)
50
+ end
51
+ end
52
+
53
+
54
+ def test_device_malloc_free
55
+ p = CUDevice.malloc(1024)
56
+ assert_instance_of(CUDevicePtr, p)
57
+ r = p.free
58
+ assert_nil(r)
59
+ end
60
+
61
+
62
+ def test_device_malloc_with_huge_mem
63
+ assert_raise(CUOutOfMemoryError) do
64
+ size = @dev.total_mem + 1
65
+ CUDevice.malloc(size)
66
+ end
67
+ end
68
+
69
+ end
@@ -0,0 +1,43 @@
1
+ #-----------------------------------------------------------------------
2
+ # Copyright (c) 2010-2011 Chung Shin Yee
3
+ #
4
+ # shinyee@speedgocomputing.com
5
+ # http://www.speedgocomputing.com
6
+ # http://github.com/xman/sgc-ruby-cuda
7
+ # http://rubyforge.org/projects/rubycuda
8
+ #
9
+ # This file is part of SGC-Ruby-CUDA.
10
+ #
11
+ # SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
12
+ # it under the terms of the GNU General Public License as published by
13
+ # the Free Software Foundation, either version 3 of the License, or
14
+ # (at your option) any later version.
15
+ #
16
+ # SGC-Ruby-CUDA is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ # GNU General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU General Public License
22
+ # along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
23
+ #-----------------------------------------------------------------------
24
+
25
+ require 'test/unit'
26
+ require_relative 'testbase'
27
+
28
+
29
+ class TestCUDevicePtr < Test::Unit::TestCase
30
+
31
+ include CUTestBase
32
+
33
+
34
+ def test_device_ptr_offset
35
+ devptr = CUDevice.malloc(1024)
36
+ p = devptr.offset(1024)
37
+ assert_instance_of(CUDevicePtr, p)
38
+ p = devptr.offset(-1024)
39
+ assert_instance_of(CUDevicePtr, p)
40
+ devptr.free
41
+ end
42
+
43
+ end
@@ -0,0 +1,81 @@
1
+ #-----------------------------------------------------------------------
2
+ # Copyright (c) 2010-2011 Chung Shin Yee
3
+ #
4
+ # shinyee@speedgocomputing.com
5
+ # http://www.speedgocomputing.com
6
+ # http://github.com/xman/sgc-ruby-cuda
7
+ # http://rubyforge.org/projects/rubycuda
8
+ #
9
+ # This file is part of SGC-Ruby-CUDA.
10
+ #
11
+ # SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
12
+ # it under the terms of the GNU General Public License as published by
13
+ # the Free Software Foundation, either version 3 of the License, or
14
+ # (at your option) any later version.
15
+ #
16
+ # SGC-Ruby-CUDA is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ # GNU General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU General Public License
22
+ # along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
23
+ #-----------------------------------------------------------------------
24
+
25
+ require 'test/unit'
26
+ require_relative 'testbase'
27
+
28
+
29
+ class TestCUEvent < Test::Unit::TestCase
30
+
31
+ include CUTestBase
32
+
33
+
34
+ def test_event_create_destroy
35
+ e = CUEvent.create
36
+ assert_instance_of(CUEvent, e)
37
+ e = e.destroy
38
+ assert_nil(e)
39
+
40
+ e = CUEvent.create(:DEFAULT)
41
+ assert_instance_of(CUEvent, e)
42
+ e = e.destroy
43
+ assert_nil(e)
44
+
45
+ e = CUEvent.create(:DEFAULT, :BLOCKING_SYNC)
46
+ assert_instance_of(CUEvent, e)
47
+ e = e.destroy
48
+ assert_nil(e)
49
+
50
+ e = CUEvent.create([:BLOCKING_SYNC, :DISABLE_TIMING])
51
+ assert_instance_of(CUEvent, e)
52
+ e = e.destroy
53
+ assert_nil(e)
54
+ end
55
+
56
+
57
+ def test_event_record_synchronize_query
58
+ e = CUEvent.create(:DEFAULT)
59
+ e = e.record(0)
60
+ assert_instance_of(CUEvent, e)
61
+ e = e.synchronize
62
+ assert_instance_of(CUEvent, e)
63
+ b = e.query
64
+ assert(b)
65
+ e.destroy
66
+ end
67
+
68
+
69
+ def test_event_elapsed_time
70
+ e1 = CUEvent.create(:DEFAULT)
71
+ e2 = CUEvent.create(:DEFAULT)
72
+ e1.record(0)
73
+ e2.record(0)
74
+ e2.synchronize
75
+ elapsed = CUEvent.elapsed_time(e1, e2)
76
+ assert_instance_of(Float, elapsed)
77
+ e1.destroy
78
+ e2.destroy
79
+ end
80
+
81
+ end