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.
- data/.yardopts +2 -0
- data/COPYING +674 -0
- data/README.rdoc +106 -0
- data/Rakefile +76 -0
- data/doc/devel.rdoc +77 -0
- data/doc/features.rdoc +55 -0
- data/lib/cuda/driver/context.rb +236 -0
- data/lib/cuda/driver/cu.rb +60 -0
- data/lib/cuda/driver/device.rb +155 -0
- data/lib/cuda/driver/deviceptr.rb +69 -0
- data/lib/cuda/driver/error.rb +182 -0
- data/lib/cuda/driver/event.rb +124 -0
- data/lib/cuda/driver/ffi-cu.rb +620 -0
- data/lib/cuda/driver/function.rb +293 -0
- data/lib/cuda/driver/init.rb +45 -0
- data/lib/cuda/driver/memory.rb +134 -0
- data/lib/cuda/driver/module.rb +142 -0
- data/lib/cuda/driver/rubycu.rb +37 -0
- data/lib/cuda/driver/stream.rb +128 -0
- data/lib/cuda/driver/version.rb +42 -0
- data/lib/cuda/runtime/cuda.rb +65 -0
- data/lib/cuda/runtime/device.rb +175 -0
- data/lib/cuda/runtime/error.rb +197 -0
- data/lib/cuda/runtime/event.rb +117 -0
- data/lib/cuda/runtime/ffi-cuda.rb +588 -0
- data/lib/cuda/runtime/function.rb +161 -0
- data/lib/cuda/runtime/memory.rb +110 -0
- data/lib/cuda/runtime/rubycuda.rb +34 -0
- data/lib/cuda/runtime/stream.rb +126 -0
- data/lib/cuda/runtime/thread.rb +81 -0
- data/lib/cuda/runtime/version.rb +51 -0
- data/lib/ffi/prettystruct.rb +32 -0
- data/lib/helpers/flags.rb +82 -0
- data/lib/helpers/interface/ienum.rb +45 -0
- data/lib/helpers/klass.rb +45 -0
- data/lib/memory/buffer.rb +125 -0
- data/lib/memory/interface/ibuffer.rb +63 -0
- data/lib/memory/pointer.rb +72 -0
- data/lib/rubycu.rb +1 -0
- data/lib/rubycuda.rb +1 -0
- data/test/bad.ptx +0 -0
- data/test/memory/test_buffer.rb +93 -0
- data/test/rubycu/test_cucontext.rb +148 -0
- data/test/rubycu/test_cudevice.rb +69 -0
- data/test/rubycu/test_cudeviceptr.rb +43 -0
- data/test/rubycu/test_cuevent.rb +81 -0
- data/test/rubycu/test_cufunction.rb +165 -0
- data/test/rubycu/test_cumemory.rb +113 -0
- data/test/rubycu/test_cumodule.rb +114 -0
- data/test/rubycu/test_custream.rb +77 -0
- data/test/rubycu/test_cuversion.rb +39 -0
- data/test/rubycu/testbase.rb +107 -0
- data/test/rubycuda/test_cudadevice.rb +125 -0
- data/test/rubycuda/test_cudaerror.rb +48 -0
- data/test/rubycuda/test_cudaevent.rb +78 -0
- data/test/rubycuda/test_cudafunction.rb +106 -0
- data/test/rubycuda/test_cudamemory.rb +90 -0
- data/test/rubycuda/test_cudastream.rb +72 -0
- data/test/rubycuda/test_cudathread.rb +69 -0
- data/test/rubycuda/test_cudaversion.rb +41 -0
- data/test/rubycuda/testbase.rb +67 -0
- data/test/vadd.cu +21 -0
- data/version.rb +1 -0
- metadata +180 -0
@@ -0,0 +1,142 @@
|
|
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 'cuda/driver/ffi-cu'
|
26
|
+
require 'cuda/driver/cu'
|
27
|
+
require 'cuda/driver/error'
|
28
|
+
require 'cuda/driver/function'
|
29
|
+
|
30
|
+
|
31
|
+
module SGC
|
32
|
+
module CU
|
33
|
+
|
34
|
+
class CUModule
|
35
|
+
|
36
|
+
# Allocate a CUDA module.
|
37
|
+
def initialize
|
38
|
+
@pmod = FFI::MemoryPointer.new(:CUModule)
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
# Load a compute module from the file at _path_ into the current CUDA context.
|
43
|
+
# The file should be a cubin file or a PTX file.
|
44
|
+
#
|
45
|
+
# A PTX file may be obtained by compiling the .cu file using nvcc with -ptx option.
|
46
|
+
# $ nvcc -ptx vadd.cu
|
47
|
+
#
|
48
|
+
# @param [String] path The path of the file to load.
|
49
|
+
# @return [CUModule] This CUDA module.
|
50
|
+
def load(path)
|
51
|
+
status = API::cuModuleLoad(@pmod, path)
|
52
|
+
Pvt::handle_error(status, "Failed to load module: path = #{path}.")
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
# Load a compute module from the String _image_str_ into the current CUDA context.
|
58
|
+
# @param [String] image_str A string which contains a cubin or a PTX data.
|
59
|
+
# @return [CUModule] This CUDA module.
|
60
|
+
#
|
61
|
+
# @see #load
|
62
|
+
def load_data(image_str)
|
63
|
+
status = API::cuModuleLoadData(@pmod, image_str)
|
64
|
+
Pvt::handle_error(status, "Failed to load module data.")
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
# @note Not implemented yet.
|
70
|
+
#
|
71
|
+
# @see #load
|
72
|
+
def load_data_ex
|
73
|
+
raise NotImplementedError
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
# @note Not implemented yet.
|
78
|
+
#
|
79
|
+
# @see #load
|
80
|
+
def load_fat_binary
|
81
|
+
raise NotImplementedError
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
# Unload this CUDA module from the current CUDA context.
|
86
|
+
# @return [CUModule] This CUDA module.
|
87
|
+
def unload
|
88
|
+
status = API::cuModuleUnload(self.to_api)
|
89
|
+
Pvt::handle_error(status, "Failed to unload module.")
|
90
|
+
self
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
# Lookup for a CUDA function corresponds to the function name _name_ in the loaded compute module.
|
95
|
+
# A compute module was loaded with {CUModule#load} and alike methods.
|
96
|
+
# @param [String] name The name of the function to lookup in the loaded compute modules.
|
97
|
+
# @return [CUFunction] The CUDA function corresponds to _name_ in the loaded compute module.
|
98
|
+
def function(name)
|
99
|
+
p = FFI::MemoryPointer.new(:CUFunction)
|
100
|
+
status = API::cuModuleGetFunction(p, self.to_api, name)
|
101
|
+
Pvt::handle_error(status, "Failed to get module function: name = #{name}.")
|
102
|
+
CUFunction.send(:new, p)
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
# Lookup for the device pointer and the size of the global variable _name_ in the loaded compute modules.
|
107
|
+
# @param [String] name The name of the global variable to lookup in the loaded compute modules.
|
108
|
+
# @return [Array(CUDevicePtr, Integer)] An array with a device pointer to the global variable and its size in bytes.
|
109
|
+
def global(name)
|
110
|
+
pdevptr = FFI::MemoryPointer.new(:CUDevicePtr)
|
111
|
+
psize = FFI::MemoryPointer.new(:size_t)
|
112
|
+
status = API::cuModuleGetGlobal(pdevptr, psize, self.to_api, name)
|
113
|
+
Pvt::handle_error(status, "Failed to get module global: name = #{name}.")
|
114
|
+
[CUDevicePtr.send(:new, pdevptr), API::read_size_t(psize)]
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
# @return A texture reference corresponds to the texture _name_ in the loaded compute module.
|
119
|
+
#
|
120
|
+
# @note Not implemented yet.
|
121
|
+
def texref(name)
|
122
|
+
raise NotImplementedError
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
# @return A surface texture reference corresponds to the surface _name_ in the loaded compute module.
|
127
|
+
#
|
128
|
+
# @note Not implemented yet.
|
129
|
+
def surfref(name)
|
130
|
+
raise NotImplementedError
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
# @private
|
135
|
+
def to_api
|
136
|
+
API::read_cufunction(@pmod)
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
end # module
|
142
|
+
end # module
|
@@ -0,0 +1,37 @@
|
|
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 'cuda/driver/ffi-cu'
|
26
|
+
require 'cuda/driver/cu'
|
27
|
+
require 'cuda/driver/error'
|
28
|
+
require 'cuda/driver/init'
|
29
|
+
require 'cuda/driver/version'
|
30
|
+
require 'cuda/driver/device'
|
31
|
+
require 'cuda/driver/context'
|
32
|
+
require 'cuda/driver/deviceptr'
|
33
|
+
require 'cuda/driver/function'
|
34
|
+
require 'cuda/driver/memory'
|
35
|
+
require 'cuda/driver/module'
|
36
|
+
require 'cuda/driver/stream'
|
37
|
+
require 'cuda/driver/event'
|
@@ -0,0 +1,128 @@
|
|
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 'cuda/driver/ffi-cu'
|
26
|
+
require 'cuda/driver/error'
|
27
|
+
|
28
|
+
|
29
|
+
module SGC
|
30
|
+
module CU
|
31
|
+
|
32
|
+
class CUStream
|
33
|
+
|
34
|
+
# Create and return a stream with _flags_.
|
35
|
+
# @overload create
|
36
|
+
# @overload create(flags)
|
37
|
+
# @param [Integer] flags Currently _flags_ must be set to zero.
|
38
|
+
# @return [CUStream] A CUDA stream created with _flags_.
|
39
|
+
def self.create(flags = 0)
|
40
|
+
p = FFI::MemoryPointer.new(:CUStream)
|
41
|
+
status = API::cuStreamCreate(p, flags)
|
42
|
+
Pvt::handle_error(status, "Failed to create stream: flags = #{flags}.")
|
43
|
+
new(p)
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
# Destroy this CUDA stream.
|
48
|
+
def destroy
|
49
|
+
status = API::cuStreamDestroy(self.to_api)
|
50
|
+
Pvt::handle_error(status, "Failed to destroy stream.")
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
# @return [Boolean] Return true if all operations in this CUDA stream have completed. Otherwise, return false.
|
56
|
+
def query
|
57
|
+
status = API::cuStreamQuery(self.to_api)
|
58
|
+
if status == Pvt::CUDA_SUCCESS
|
59
|
+
return true
|
60
|
+
elsif status == Pvt::CUDA_ERROR_NOT_READY
|
61
|
+
return false
|
62
|
+
end
|
63
|
+
Pvt::handle_error(status, "Failed to query stream.")
|
64
|
+
raise CUStandardError, "Error handling fails to catch this error."
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
# Block the calling CPU thread until all operations in this CUDA stream complete.
|
69
|
+
# @return [CUStream] This CUDA stream.
|
70
|
+
def synchronize
|
71
|
+
status = API::cuStreamSynchronize(self.to_api)
|
72
|
+
Pvt::handle_error(status, "Failed to synchronize stream.")
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
# Let all future operations submitted to this CUDA stream wait until _event_ (CUEvent) complete before beginning execution.
|
78
|
+
# @overload wait_event(event)
|
79
|
+
# @overload wait_event(event, flags)
|
80
|
+
# @param [CUEvent] event The event to wait for.
|
81
|
+
# @param [Integer] flags Currently _flags_ must be set to zero.
|
82
|
+
# @return [CUStream] This CUDA stream.
|
83
|
+
def wait_event(event, flags = 0)
|
84
|
+
status = API::cuStreamWaitEvent(self.to_api, event.to_api, flags)
|
85
|
+
Pvt::handle_error(status, "Failed to make stream's future operations to wait event: flags = #{flags}.")
|
86
|
+
self
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
# Let all future operations submitted to any stream in this context wait until _event_ (CUEvent) complete before beginning execution.
|
91
|
+
# @overload wait_event(event)
|
92
|
+
# @overload wait_event(event, flags)
|
93
|
+
# @param (see CUStream#wait_event)
|
94
|
+
def self.wait_event(event, flags = 0)
|
95
|
+
status = API::cuStreamWaitEvent(nil, event.to_api, flags)
|
96
|
+
Pvt::handle_error(status, "Failed to make any stream's future operations to wait event: flags = #{flags}.")
|
97
|
+
nil
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
# @private
|
102
|
+
def initialize(ptr)
|
103
|
+
@pstream = ptr
|
104
|
+
end
|
105
|
+
private_class_method :new
|
106
|
+
|
107
|
+
|
108
|
+
# @private
|
109
|
+
def to_api
|
110
|
+
API::read_custream(@pstream)
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
# @private
|
116
|
+
module Pvt
|
117
|
+
|
118
|
+
def self.parse_stream(stream)
|
119
|
+
if stream.kind_of?(CUStream)
|
120
|
+
return stream.to_api
|
121
|
+
end
|
122
|
+
nil
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
end # module
|
128
|
+
end # module
|
@@ -0,0 +1,42 @@
|
|
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 'cuda/driver/ffi-cu'
|
26
|
+
require 'cuda/driver/error'
|
27
|
+
|
28
|
+
|
29
|
+
module SGC
|
30
|
+
module CU
|
31
|
+
|
32
|
+
# @return [Integer] The CUDA driver version.
|
33
|
+
def driver_version
|
34
|
+
p = FFI::MemoryPointer.new(:int)
|
35
|
+
status = API::cuDriverGetVersion(p)
|
36
|
+
Pvt::handle_error(status, "Failed to get the CUDA driver version.")
|
37
|
+
p.read_int
|
38
|
+
end
|
39
|
+
module_function :driver_version
|
40
|
+
|
41
|
+
end # module
|
42
|
+
end # module
|
@@ -0,0 +1,65 @@
|
|
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 'cuda/runtime/ffi-cuda'
|
26
|
+
require 'memory/buffer'
|
27
|
+
|
28
|
+
|
29
|
+
module SGC
|
30
|
+
module Cuda
|
31
|
+
|
32
|
+
include SGC::Memory
|
33
|
+
|
34
|
+
class CudaError < API::Enum; end # @see API::CudaError
|
35
|
+
class CudaDeviceFlags < API::Enum; end # @see API::CudaDeviceFlags
|
36
|
+
class CudaEventFlags < API::Enum; end # @see API::CudaEventFlags
|
37
|
+
class CudaHostAllocFlags < API::Enum; end # @see API::CudaHostAllocFlags
|
38
|
+
class CudaHostRegisterFlags < API::Enum; end # @see API::CudaHostRegisterFlags
|
39
|
+
class CudaArrayFlags < API::Enum; end # @see API::CudaArrayFlags
|
40
|
+
class CudaMemoryType < API::Enum; end # @see API::CudaMemoryType
|
41
|
+
class CudaMemcpyKind < API::Enum; end # @see API::CudaMemcpyKind
|
42
|
+
class CudaChannelFormatKind < API::Enum; end # @see API::CudaChannelFormatKind
|
43
|
+
class CudaFunctionCache < API::Enum; end # @see API::CudaFunctionCache
|
44
|
+
class CudaLimit < API::Enum; end # @see API::CudaLimit
|
45
|
+
class CudaOutputMode < API::Enum; end # @see API::CudaOutputMode
|
46
|
+
class CudaComputeMode < API::Enum; end # @see API::CudaComputeMode
|
47
|
+
class CudaSurfaceBoundaryMode < API::Enum; end # @see API::CudaSurfaceBoundaryMode
|
48
|
+
class CudaSurfaceFormatMode < API::Enum; end # @see API::CudaSurfaceFormatMode
|
49
|
+
class CudaTextureAddressMode < API::Enum; end # @see API::CudaTextureAddressMode
|
50
|
+
class CudaTextureFilterMode < API::Enum; end # @see API::CudaTextureFilterMode
|
51
|
+
class CudaTextureReadMode < API::Enum; end # @see API::CudaTextureReadMode
|
52
|
+
|
53
|
+
class Dim3 < API::Dim3; end
|
54
|
+
class CudaDeviceProp < API::CudaDeviceProp; end
|
55
|
+
class CudaFunctionAttributes < API::CudaFunctionAttributes; end
|
56
|
+
class CudaChannelFormatDesc < API::CudaChannelFormatDesc; end
|
57
|
+
class CudaPitchedPtr < API::CudaPitchedPtr; end
|
58
|
+
class CudaPos < API::CudaPos; end
|
59
|
+
class CudaExtent < API::CudaExtent; end
|
60
|
+
class CudaMemcpy3DParms < API::CudaMemcpy3DParms; end
|
61
|
+
class TextureReference < API::TextureReference; end
|
62
|
+
class SurfaceReference < API::SurfaceReference; end
|
63
|
+
|
64
|
+
end # module
|
65
|
+
end # module
|
@@ -0,0 +1,175 @@
|
|
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 'cuda/runtime/ffi-cuda'
|
26
|
+
require 'cuda/runtime/error'
|
27
|
+
|
28
|
+
|
29
|
+
module SGC
|
30
|
+
module Cuda
|
31
|
+
|
32
|
+
class CudaDevice
|
33
|
+
|
34
|
+
# @return [Integer] The number of CUDA devices.
|
35
|
+
def self.count
|
36
|
+
p = FFI::MemoryPointer.new(:int)
|
37
|
+
status = API::cudaGetDeviceCount(p)
|
38
|
+
Pvt::handle_error(status, "Failed to get device count.")
|
39
|
+
p.read_int
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
# @return [Integer] The index of the current CUDA device in use.
|
44
|
+
def self.get
|
45
|
+
p = FFI::MemoryPointer.new(:int)
|
46
|
+
status = API::cudaGetDevice(p)
|
47
|
+
Pvt::handle_error(status, "Failed to get current device.")
|
48
|
+
p.read_int
|
49
|
+
end
|
50
|
+
class << self; alias_method :current, :get; end
|
51
|
+
|
52
|
+
|
53
|
+
# Set _devid_ as the current CUDA device.
|
54
|
+
# @param [Integer] devid The index (0..CudaDevice.count-1) of the CUDA device to set as current.
|
55
|
+
# @return [Class] This class.
|
56
|
+
def self.set(devid)
|
57
|
+
status = API::cudaSetDevice(devid)
|
58
|
+
Pvt::handle_error(status, "Failed to set current device: devid = #{devid}.")
|
59
|
+
self
|
60
|
+
end
|
61
|
+
class << self; alias_method :current=, :set; end
|
62
|
+
|
63
|
+
|
64
|
+
# @param [CudaDeviceProp] prop The criteria for choosing a CUDA device.
|
65
|
+
# @return [Integer] The index of the CUDA device best matches the criteria.
|
66
|
+
def self.choose(prop)
|
67
|
+
pdev = FFI::MemoryPointer.new(:int)
|
68
|
+
status = API::cudaChooseDevice(pdev, prop.to_ptr)
|
69
|
+
Pvt::handle_error(status, "Failed to choose a device with criteria.")
|
70
|
+
pdev.read_int
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
# @param [Integer] devid The index of the device to query.
|
75
|
+
# @return [CUDeviceProp] The properties of the device _devid_.
|
76
|
+
def self.properties(devid = self.get)
|
77
|
+
prop = CudaDeviceProp.new
|
78
|
+
status = API::cudaGetDeviceProperties(prop.to_ptr, devid)
|
79
|
+
Pvt::handle_error(status, "Failed to get device properties: devid = #{devid}.")
|
80
|
+
prop
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
# Set the flags to be used for device execution.
|
85
|
+
# @param [Integer, CudaDeviceFlags, Array<Integer, CudaDeviceFlags>] flags The flags for device execution.
|
86
|
+
def self.flags=(flags)
|
87
|
+
f = CudaDeviceFlags.value(flags)
|
88
|
+
status = API::cudaSetDeviceFlags(f)
|
89
|
+
Pvt::handle_error(status, "Failed to set device flags: flags = #{flags}.")
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
# Set the list of CUDA devices that can be used.
|
94
|
+
# @param [Array] devs The list of CUDA device indexes.
|
95
|
+
def self.valid_devices=(devs)
|
96
|
+
p = FFI::MemoryPointer.new(:int, devs.count)
|
97
|
+
devs.each_with_index do |devid, i|
|
98
|
+
p[i].write_int(devid)
|
99
|
+
end
|
100
|
+
status = API::cudaSetValidDevices(p, devs.count)
|
101
|
+
Pvt::handle_error(status, "Failed to set valid devices: devs = #{devs}.")
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
# @return [CudaFunctionCache] The cache config of the current CUDA device.
|
106
|
+
#
|
107
|
+
# @since CUDA 4.0
|
108
|
+
def self.cache_config
|
109
|
+
p = FFI::MemoryPointer.new(:enum)
|
110
|
+
status = API::cudaDeviceGetCacheConfig(p)
|
111
|
+
Pvt::handle_error(status, "Failed to get the current CUDA device cache config.")
|
112
|
+
CudaFunctionCache[API::read_enum(p)]
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
# Set the cache config of the current CUDA device to _conf_.
|
117
|
+
# @param [CudaFunctionCache] conf The cache config of the current CUDA device to set to.
|
118
|
+
#
|
119
|
+
# @since CUDA 4.0
|
120
|
+
def self.cache_config=(conf)
|
121
|
+
status = API::cudaDeviceSetCacheConfig(conf)
|
122
|
+
Pvt::handle_error(status, "Failed to set the current CUDA device cache config.")
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
# @param [CudaLimit] lim The particular limit attribute to query.
|
127
|
+
# @return [CudaLimit] The limit _lim_ of the current CUDA device.
|
128
|
+
#
|
129
|
+
# @since CUDA 4.0
|
130
|
+
def self.limit(lim)
|
131
|
+
p = FFI::MemoryPointer.new(:size_t)
|
132
|
+
status = API::cudaDeviceGetLimit(p, lim)
|
133
|
+
Pvt::handle_error(status, "Failed to get the current CUDA device limit: limit = #{lim}.")
|
134
|
+
API::read_size_t(p)
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
# Set the limit _lim_ of the current CUDA device.
|
139
|
+
# @param [CudaLimit] lim The particular limit attribute to set.
|
140
|
+
# @param [Integer] value The value to set the limit to.
|
141
|
+
#
|
142
|
+
# @since CUDA 4.0
|
143
|
+
def self.limit=(*lim_val_pair)
|
144
|
+
lim, val = lim_val_pair.flatten
|
145
|
+
lim != nil && val != nil or raise ArgumentError, "Invalid limit and value pair given: limit = #{lim}, value = #{val}."
|
146
|
+
status = API::cudaDeviceSetLimit(lim, val)
|
147
|
+
Pvt::handle_error(status, "Failed to set the current CUDA device limit: limit = #{lim}, value = #{val}")
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
# Destroy all allocations and reset all state on the current CUDA device.
|
152
|
+
# @return [Class] This class.
|
153
|
+
#
|
154
|
+
# @since CUDA 4.0
|
155
|
+
def self.reset
|
156
|
+
status = API::cudaDeviceReset()
|
157
|
+
Pvt::handle_error(status, "Failed to reset the current CUDA device.")
|
158
|
+
self
|
159
|
+
end
|
160
|
+
|
161
|
+
|
162
|
+
# Block until all the tasks of the current CUDA device complete.
|
163
|
+
# @return [Class] This class.
|
164
|
+
#
|
165
|
+
# @since CUDA 4.0
|
166
|
+
def self.synchronize
|
167
|
+
status = API::cudaDeviceSynchronize()
|
168
|
+
Pvt::handle_error(status, "Failed to synchronize the current CUDA device.")
|
169
|
+
self
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
end # module
|
175
|
+
end # module
|