sgc-ruby-cuda 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,39 @@
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 TestCUVersion < Test::Unit::TestCase
30
+
31
+ include CUTestBase
32
+
33
+
34
+ def test_version
35
+ v = driver_version
36
+ assert_kind_of(Integer, v)
37
+ end
38
+
39
+ end
@@ -0,0 +1,107 @@
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 'rubycu'
26
+
27
+ include SGC::CU
28
+ include SGC::CU::Error
29
+
30
+ CUInit.init
31
+
32
+
33
+ module CUTestBase
34
+
35
+ def setup
36
+ @dev = CUDevice.get(ENV['DEVID'].to_i)
37
+ @ctx = CUContext.create(@dev)
38
+ @mod = prepare_loaded_module
39
+ @func = @mod.function("vadd")
40
+ end
41
+
42
+ def teardown
43
+ @func = nil
44
+ @mod.unload
45
+ @mod = nil
46
+ @ctx.destroy
47
+ @ctx = nil
48
+ @dev = nil
49
+ end
50
+
51
+
52
+ def prepare_ptx
53
+ if File.exists?('test/vadd.ptx') == false || File.mtime('test/vadd.cu') > File.mtime('test/vadd.ptx')
54
+ system %{cd test; nvcc --ptx vadd.cu}
55
+ end
56
+ 'test/vadd.ptx'
57
+ end
58
+
59
+
60
+ def prepare_loaded_module
61
+ path = prepare_ptx
62
+ m = CUModule.new
63
+ m.load(path)
64
+ end
65
+
66
+
67
+ def assert_device(dev)
68
+ assert_device_name(dev)
69
+ assert_device_memory_size(dev)
70
+ assert_device_capability(dev)
71
+ assert_device_properties(dev)
72
+ end
73
+
74
+ def assert_device_name(dev)
75
+ assert(dev.name.size > 0, "Device name failed.")
76
+ end
77
+
78
+ def assert_device_memory_size(dev)
79
+ assert(dev.total_mem > 0, "Device total memory size failed.")
80
+ end
81
+
82
+ def assert_device_capability(dev)
83
+ cap = dev.compute_capability
84
+ assert(cap[:major] > 0 && cap[:minor] >= 0, "Device compute capability failed.")
85
+ end
86
+
87
+ def assert_device_properties(dev)
88
+ p = dev.properties
89
+ assert(p[:clock_rate] > 0)
90
+ assert(p[:max_threads_per_block] > 0)
91
+ assert(p[:mem_pitch] > 0)
92
+ assert(p[:regs_per_block] > 0)
93
+ assert(p[:shared_mem_per_block] > 0)
94
+ assert(p[:simd_width] > 0)
95
+ assert(p[:texture_align] > 0)
96
+ assert(p[:total_constant_memory] > 0)
97
+ assert_equal(3, p[:max_grid_size].count)
98
+ assert_kind_of(Integer, p[:max_grid_size][0])
99
+ assert_kind_of(Integer, p[:max_grid_size][1])
100
+ assert_kind_of(Integer, p[:max_grid_size][2])
101
+ assert_equal(3, p[:max_threads_dim].count)
102
+ assert_kind_of(Integer, p[:max_threads_dim][0])
103
+ assert_kind_of(Integer, p[:max_threads_dim][1])
104
+ assert_kind_of(Integer, p[:max_threads_dim][2])
105
+ end
106
+
107
+ end
@@ -0,0 +1,125 @@
1
+ #-----------------------------------------------------------------------
2
+ # Copyright (c) 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 TestCudaDevice < Test::Unit::TestCase
30
+
31
+ include CudaTestBase
32
+
33
+
34
+ def test_device_count
35
+ count = CudaDevice.count
36
+ assert(count > 0, "Device count failed.")
37
+ end
38
+
39
+
40
+ def test_device_get_set
41
+ count = CudaDevice.count
42
+ (0...count).each do |devid|
43
+ r = CudaDevice.set(devid)
44
+ assert_equal(CudaDevice, r)
45
+ d = CudaDevice.get
46
+ assert_equal(devid, d)
47
+ end
48
+
49
+ count = CudaDevice.count
50
+ (0...count).each do |devid|
51
+ CudaDevice.current = devid
52
+ d = CudaDevice.current
53
+ assert_equal(devid, d)
54
+ end
55
+ end
56
+
57
+
58
+ def test_device_choose
59
+ count = CudaDevice.count
60
+ prop = CudaDeviceProp.new
61
+ devid = CudaDevice.choose(prop)
62
+ assert(devid >= 0 && devid < count)
63
+ end
64
+
65
+
66
+ def test_device_properties
67
+ prop = CudaDevice.properties
68
+ assert_instance_of(CudaDeviceProp, prop)
69
+ # TODO: assert the content of the _prop_.
70
+ end
71
+
72
+
73
+ def test_device_flags
74
+ CudaDeviceFlags.symbols.each do |k|
75
+ CudaDevice.flags = k
76
+ end
77
+ end
78
+
79
+
80
+ def test_device_valid_devices
81
+ count = CudaDevice.count
82
+ devs = []
83
+ (0...count).each do |devid|
84
+ devs << devid
85
+ end
86
+ CudaDevice.valid_devices = devs
87
+ end
88
+
89
+
90
+ def test_device_cache_config
91
+ if CudaDevice.properties.major >= 2
92
+ CudaFunctionCache.symbols.each do |k|
93
+ CudaDevice.cache_config = k
94
+ c = CudaDevice.cache_config
95
+ assert_equal(k, c)
96
+ end
97
+ end
98
+ end
99
+
100
+
101
+ def test_device_limit
102
+ CudaLimit.symbols.each do |k|
103
+ begin
104
+ u = CudaDevice.limit(k)
105
+ CudaDevice.limit = [k, u]
106
+ v = CudaDevice.limit(k)
107
+ assert_equal(u, v)
108
+ rescue CudaUnsupportedLimitError
109
+ end
110
+ end
111
+ end
112
+
113
+
114
+ def test_device_reset
115
+ r = CudaDevice.reset
116
+ assert_equal(CudaDevice, r)
117
+ end
118
+
119
+
120
+ def test_device_synchronize
121
+ r = CudaDevice.synchronize
122
+ assert_equal(CudaDevice, r)
123
+ end
124
+
125
+ end
@@ -0,0 +1,48 @@
1
+ #-----------------------------------------------------------------------
2
+ # Copyright (c) 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 TestCudaError < Test::Unit::TestCase
30
+
31
+ include CudaTestBase
32
+
33
+
34
+ def test_error
35
+ CudaError.symbols.each do |k|
36
+ s = get_error_string(k)
37
+ assert(s.size > 0)
38
+ end
39
+ e = get_last_error
40
+ s = get_error_string(e)
41
+ assert(s.size > 0)
42
+
43
+ e = peek_at_last_error
44
+ s = get_error_string(e)
45
+ assert(s.size > 0)
46
+ end
47
+
48
+ end
@@ -0,0 +1,78 @@
1
+ #-----------------------------------------------------------------------
2
+ # Copyright (c) 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 TestCudaEvent < Test::Unit::TestCase
30
+
31
+ include CudaTestBase
32
+
33
+
34
+ def test_event_create_destroy
35
+ e = CudaEvent.create
36
+ assert_instance_of(CudaEvent, e)
37
+ r = e.destroy
38
+ assert_nil(r)
39
+
40
+ e = CudaEvent.create(CudaEventFlags.value(:DEFAULT, :BLOCKING_SYNC))
41
+ assert_instance_of(CudaEvent, e)
42
+ r = e.destroy
43
+ assert_nil(r)
44
+
45
+ e = CudaEvent.create(:DEFAULT, :BLOCKING_SYNC)
46
+ assert_instance_of(CudaEvent, e)
47
+ r = e.destroy
48
+ assert_nil(r)
49
+ end
50
+
51
+
52
+ def test_event_record_synchronize_query
53
+ e = CudaEvent.create
54
+ e = e.record
55
+ assert_instance_of(CudaEvent, e)
56
+ e = e.synchronize
57
+ assert_instance_of(CudaEvent, e)
58
+ b = e.query
59
+ assert(b)
60
+ e.destroy
61
+ end
62
+
63
+
64
+ def test_event_elapsed_time
65
+ e1 = CudaEvent.create
66
+ e2 = CudaEvent.create
67
+
68
+ e1.record
69
+ e2.record
70
+ e2.synchronize
71
+ t = CudaEvent.elapsed_time(e1, e2)
72
+ assert_kind_of(Numeric, t)
73
+
74
+ e1.destroy
75
+ e2.destroy
76
+ end
77
+
78
+ end
@@ -0,0 +1,106 @@
1
+ #-----------------------------------------------------------------------
2
+ # Copyright (c) 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 TestCudaFunction < Test::Unit::TestCase
30
+
31
+ include CudaTestBase
32
+
33
+
34
+ def test_function_name
35
+ f = CudaFunction.new("vadd")
36
+ assert_equal("vadd", f.name)
37
+ end
38
+
39
+
40
+ def test_function_attributes
41
+ path = prepare_kernel_lib
42
+ CudaFunction.load_lib_file(path)
43
+ f = CudaFunction.new("vadd")
44
+ a = f.attributes
45
+ assert_instance_of(CudaFunctionAttributes, a)
46
+ CudaFunction.unload_all_libs
47
+ end
48
+
49
+
50
+ def test_function_cache_config
51
+ path = prepare_kernel_lib
52
+ CudaFunction.load_lib_file(path)
53
+ f = CudaFunction.new("vadd")
54
+ CudaFunctionCache.symbols.each do |k|
55
+ f.cache_config = k
56
+ end
57
+ CudaFunction.unload_all_libs
58
+ end
59
+
60
+
61
+ def test_function_launch
62
+ type = :int
63
+ size = 10
64
+ nbytes = size*4
65
+
66
+ a = Buffer.new(type, size)
67
+ b = Buffer.new(type, size)
68
+ c = Buffer.new(type, size)
69
+
70
+ p = CudaDeviceMemory.malloc(nbytes)
71
+ q = CudaDeviceMemory.malloc(nbytes)
72
+ r = CudaDeviceMemory.malloc(nbytes)
73
+
74
+ (0...size).each do |i|
75
+ a[i] = i
76
+ b[i] = 2
77
+ c[i] = 0
78
+ end
79
+
80
+ CudaMemory.memcpy_htod(p, a, nbytes)
81
+ CudaMemory.memcpy_htod(q, b, nbytes)
82
+ CudaMemory.memcpy_htod(r, c, nbytes)
83
+
84
+ path = prepare_kernel_lib
85
+ CudaFunction.load_lib_file(path)
86
+
87
+ CudaFunction.configure(Dim3.new(1, 1, 1), Dim3.new(size, 1, 1))
88
+ CudaFunction.setup(p, q, r, size)
89
+
90
+ f = CudaFunction.new("vadd")
91
+ f.launch
92
+
93
+ CudaMemory.memcpy_dtoh(c, r, nbytes)
94
+
95
+ (0...size).each do |i|
96
+ assert_equal(a[i] + b[i], c[i])
97
+ end
98
+
99
+ CudaFunction.unload_all_libs
100
+
101
+ CudaDeviceMemory.free(p)
102
+ CudaDeviceMemory.free(q)
103
+ CudaDeviceMemory.free(r)
104
+ end
105
+
106
+ end