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,106 @@
1
+ == Welcome to SGC-Ruby-CUDA
2
+
3
+ SGC-Ruby-CUDA implements Ruby bindings to Nvidia CUDA SDK. It provides easy
4
+ access to CUDA-enabled GPU from a Ruby program.
5
+
6
+ SGC-Ruby-CUDA is incomplete in many ways. Currently, it supports only some
7
+ crucial CUDA Driver and Runtime API functions. We hope to expand the coverage
8
+ as much as possible.
9
+
10
+ SGC-Ruby-CUDA is tested on 64bit Fedora 14. We are looking forward to support
11
+ Mac OSX. We have not tested it against 32bit Linux OS and Windows. We certainly
12
+ wish to improve the code base to support multiple platforms in the future.
13
+ We also welcome CUDA users to test it against their working environments.
14
+
15
+ Current development will focus on supporting CUDA Toolkit 4.0.
16
+
17
+ Check out {file:doc/features.rdoc} for the supported CUDA features.
18
+ Also see {file:doc/devel.rdoc} for the latest development plan.
19
+
20
+
21
+ Fedora and the Infinity design logo are trademarks of Red Hat, Inc.
22
+
23
+ Linux is a registered trademark of Linus Torvalds.
24
+
25
+ NVIDIA, the NVIDIA logo, CUDA, GeForce, Quadro, and Tesla are trademarks or
26
+ registered trademarks of NVIDIA Corporation in the U.S. and other countries.
27
+
28
+ Windows is a registered trademark of Microsoft Corporation in the United States
29
+ and other countries.
30
+
31
+
32
+ == Design philosophy
33
+
34
+ The Ruby bindings, Ruby CUDA API, which deal directly with Nvidia CUDA SDK C/C++
35
+ bindings retain the CUDA Driver and Runtime API in a systematic way whenever
36
+ possible. This facilitates developers familiar with CUDA C who should be able to
37
+ use SGC-Ruby-CUDA with minimum effort. At times, we may design the API to be
38
+ more Ruby-like and let go unnecessary API structure in modern programming
39
+ language.
40
+
41
+ We use Ruby-FFI as a bridge to call the CUDA C API. Ruby classes and methods to
42
+ are built on top. The use of Ruby-FFI would ease the support of multiple Ruby
43
+ interpretors.
44
+
45
+
46
+ == Prerequisites
47
+
48
+ * Ruby (Tested with Ruby 1.9.2)
49
+ * Ruby-FFI (Tested with Ruby-FFI 1.0.7)
50
+ * CUDA Toolkit (Tested with CUDA Toolkit 4.0)
51
+ * C++ compiler (Tested with GCC 4.6.0 but requires simple patch to CUDA Toolkit)
52
+ * Yard (Tested with Yard 0.6.7, required for generating documentations)
53
+
54
+
55
+ == How to get SGC-Ruby-CUDA
56
+
57
+ The SGC-Ruby-CUDA git repository can be found in the following:
58
+
59
+ http://github.com/xman/sgc-ruby-cuda
60
+ git://rubyforge.org/rubycuda.git
61
+
62
+ The master branch can be checked out with the following command:
63
+
64
+ git clone git://github.com/xman/sgc-ruby-cuda.git sgc-ruby-cuda
65
+ git clone git://rubyforge.org/rubycuda.git sgc-ruby-cuda
66
+
67
+ The devel* branches may be checked out for a peep on the latest development.
68
+ However, they are highly volatile and _rebase_ may be applied for cleaner
69
+ commits. The devel* branches serve as grace period before commits move into
70
+ mainstream or master branches which are considered stable commits. This would
71
+ minimize unnecessary fixing commits.
72
+
73
+
74
+ == Getting started
75
+
76
+ # Setup the environment. Assuming the CUDA Toolkit is installed in
77
+ # the default path /usr/local/cuda.
78
+
79
+ # For 64bit Linux:
80
+ export CPATH="/usr/local/cuda/include"
81
+ export LIBRARY_PATH="/usr/local/cuda/lib64"
82
+ export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
83
+ export PATH="/usr/local/cuda/bin:$PATH"
84
+
85
+ gem install ffi
86
+ cd sgc-ruby-cuda
87
+ rake test
88
+ # Check out the test cases in test/ on how to use Ruby CUDA API.
89
+
90
+ gem install yard
91
+ cd sgc-ruby-cuda
92
+ rake yard
93
+ # Check out the generated documentations in html/index.html with a browser.
94
+
95
+
96
+ == License
97
+
98
+ SGC-Ruby-CUDA is released under the GNU GPLv3. See the file COPYING.
99
+
100
+
101
+ == The Author
102
+
103
+ All kinds of feedbacks and bug reports are welcomed. Here is the author's email
104
+ address:
105
+
106
+ shinyee@speedgocomputing.com
@@ -0,0 +1,76 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require 'rake/testtask'
4
+ require 'rake/clean'
5
+ require 'yard'
6
+
7
+ load 'version.rb'
8
+
9
+ CUDA_PATH = "lib/cuda"
10
+ CUDA_DRIVER_PATH = "#{CUDA_PATH}/driver"
11
+ CUDA_RUNTIME_PATH = "#{CUDA_PATH}/runtime"
12
+ DOC_PATH = "doc"
13
+ HTML_OUTPUT_PATH = "html"
14
+
15
+
16
+ task :default => []
17
+
18
+ desc 'Build everything.'
19
+ task :all => [:package, :yard]
20
+
21
+
22
+ spec = Gem::Specification.new do |s|
23
+ s.platform = Gem::Platform::RUBY
24
+ s.name = 'sgc-ruby-cuda'
25
+ s.version = SGC_RUBY_CUDA_VERSION
26
+ s.summary = 'Ruby bindings for using Nvidia CUDA.'
27
+ s.description = 'SGC-Ruby-CUDA implements Ruby bindings to Nvidia CUDA SDK. It provides easy access to CUDA-enabled GPU from a Ruby program.'
28
+
29
+ s.required_ruby_version = '>= 1.9.2'
30
+
31
+ s.author = 'Chung Shin Yee'
32
+ s.email = 'shinyee@speedgocomputing.com'
33
+ s.homepage = 'https://rubyforge.org/projects/rubycuda'
34
+ s.rubyforge_project = 'rubycuda'
35
+
36
+ s.require_path = 'lib'
37
+
38
+ s.files = FileList['lib/**/*.rb', "#{DOC_PATH}/**/*.rdoc"].to_a
39
+ s.files += ['Rakefile', 'version.rb', 'README.rdoc', 'COPYING']
40
+ s.files += ['.yardopts']
41
+ s.test_files = FileList['test/{**/*.rb,vadd.cu,bad.ptx}'].to_a
42
+
43
+ s.add_dependency 'ffi', '>= 1.0.7'
44
+ s.add_dependency 'yard', '>= 0.6.7'
45
+
46
+ s.requirements << 'CUDA Toolkit 4.0'
47
+ s.requirements << 'C++ compiler'
48
+ s.requirements << 'CUDA-enabled GPU'
49
+ end
50
+
51
+ Rake::GemPackageTask.new(spec) do |pkg|
52
+ pkg.need_tar_gz = true
53
+ end
54
+
55
+
56
+ desc 'Generate SGC Ruby CUDA documentation with YARD.'
57
+ task :yard
58
+ YARD::Rake::YardocTask.new do |t|
59
+ t.files = FileList['lib/**/*.rb'].to_a
60
+ t.options += ['-o', "#{HTML_OUTPUT_PATH}"]
61
+ end
62
+
63
+
64
+ desc 'Run SGC Ruby CUDA test cases.'
65
+ task :test
66
+ Rake::TestTask.new do |t|
67
+ t.libs << 'lib'
68
+
69
+ t.test_files = FileList['test/**/test_*.rb'].to_a
70
+ t.verbose = true
71
+ end
72
+
73
+
74
+ CLEAN.include ['pkg', "#{HTML_OUTPUT_PATH}"]
75
+ CLEAN.include ['**/*.o', '**/*.so']
76
+ CLEAN.include ['test/vadd.ptx']
@@ -0,0 +1,77 @@
1
+ = Development Plan
2
+ SGC-Ruby-CUDA development plan provides an outline of features, issues, etc.
3
+ that will be tackled in order. There is currently no strict timeline on when
4
+ these features or issues will be covered. We hope at least we are progressing
5
+ consistently and catching up the development of Nvidia CUDA SDK.
6
+
7
+
8
+ == Creating Ruby bindings for using CUDA Driver API on Linux Platform
9
+
10
+ === On-going
11
+ * Include Ruby bindings for the use of CUDA compiler to compile a .cu file to
12
+ generate a .ptx file.
13
+ * Supporting CUDA Toolkit 4.0.
14
+
15
+ === Todo
16
+ * Port some CUDA samples to SGC-Ruby-CUDA with benchmark.
17
+ * Develop sample programs.
18
+
19
+
20
+ == Creating Ruby bindings for using CUDA Driver API on Mac Platform
21
+
22
+ === On-going
23
+
24
+ === Todo
25
+
26
+
27
+ == Towards robust development of Ruby CUDA Driver API
28
+
29
+ === On-going
30
+
31
+ === Todo
32
+ * Update the memory abstraction or parameter passing.
33
+ * To allow one to specify a paramater as a float or double, int or long, etc.
34
+ * To provide memory buffers for more data types?
35
+
36
+
37
+ == Creating Ruby bindings for using CUDA Runtime API on Linux Platform
38
+
39
+ === On-going
40
+ * Supporting CUDA Toolkit 4.0.
41
+
42
+ === Todo
43
+ * Develop sample programs.
44
+
45
+
46
+ == Creating Ruby bindings for using CUDA Runtime API on Mac Platform
47
+
48
+ === On-going
49
+
50
+ === Todo
51
+
52
+
53
+ == Towards portable platform - supporting Linux, Mac, Windows
54
+
55
+ === Todo
56
+ * Support portable compilations.
57
+ * Support portable paths?
58
+ * Configurable tools? compiler commands, flags, etc.
59
+ * Release SGC-Ruby-CUDA gems for multiple platforms.
60
+
61
+
62
+ == Development of generic kernel programs
63
+
64
+ === Todo
65
+ * Identify interesting sample kernel programs bundled with CUDA Toolkit, pycuda,
66
+ ruby-opencl, etc.
67
+ * Identify open source kernels available on the web.
68
+ * Adopt or develop kernel programs.
69
+ * Develop tests and benchmark programs for the kernels.
70
+ * Optimizing the kernel performance.
71
+
72
+
73
+ == Development of benchmarking suite
74
+
75
+ === Todo
76
+ * Identify existing benchmarking suites for GPU.
77
+ * Porting existing CUDA kernels and benchmark programs to SGC-Ruby-CUDA.
@@ -0,0 +1,55 @@
1
+ == Supported CUDA 4.0 Driver API Modules
2
+
3
+ * Fully supported (excluding deprecated functions).
4
+ + Partially supported.
5
+ - Not supported.
6
+
7
+ Feature Supported?
8
+ ------------------------------------------
9
+ Version Management *
10
+ Device Management *
11
+ Context Management *
12
+ Module Management +
13
+ Memory Management +
14
+ Unified Addressing -
15
+ Peer Context Memory Access -
16
+ Execution Control +
17
+ Stream Management *
18
+ Event Management *
19
+ Texture Reference Management -
20
+ Surface Reference Management -
21
+ Graphics Interoperability -
22
+ OpenGL Interoperability -
23
+ Direct3D 9 Interoperability -
24
+ Direct3D 10 Interoperability -
25
+ Direct3D 11 Interoperability -
26
+ VDPAU Interoperability -
27
+
28
+
29
+ == Supported CUDA 4.0 Runtime API Modules
30
+
31
+ * Fully supported (excluding deprecated functions).
32
+ + Partially supported.
33
+ - Not supported.
34
+
35
+ Feature Supported?
36
+ ------------------------------------------
37
+ Version Management *
38
+ Error Handling *
39
+ Device Management +
40
+ Thread Management *
41
+ Memory Management +
42
+ Unified Addressing -
43
+ Peer Device Memory Access -
44
+ Execution Control +
45
+ Stream Management *
46
+ Event Management *
47
+ Texture Reference Management -
48
+ Surface Reference Management -
49
+ C++ API Routines -
50
+ Graphics Interoperability -
51
+ OpenGL Interoperability -
52
+ Direct3D 9 Interoperability -
53
+ Direct3D 10 Interoperability -
54
+ Direct3D 11 Interoperability -
55
+ VDPAU Interoperability -
@@ -0,0 +1,236 @@
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 'helpers/flags'
29
+
30
+
31
+ module SGC
32
+ module CU
33
+
34
+ class CUContext
35
+
36
+ # Create a new CUDA context with _flags_ (CUContextFlags) and _device_ (CUDevice),
37
+ # then associate it with the calling thread, and return the context.
38
+ #
39
+ # @overload create(device)
40
+ # @overload create(flags, device)
41
+ # @param [Integer, CUContextFlags, Array<Integer, CUContextFlags>] flags
42
+ # The list of flags to use for the CUDA context creation.
43
+ # Setting _flags_ to 0 or ommitting _flags_ uses SCHED_AUTO.
44
+ # @param [CUDevice] device The device to create the CUDA context with.
45
+ # @return [CUContext] A CUDA context created with _flags_ and _device_.
46
+ #
47
+ # @example Create CUDA context with different flags.
48
+ # dev = CUDevice.get(0)
49
+ # CUContext.create(dev) #=> ctx
50
+ # CUContext.create(0, dev) #=> ctx
51
+ # CUContext.create(:SCHED_SPIN, dev) #=> ctx
52
+ # CUContext.create([:SCHED_SPIN, :BLOCKING_SYNC], dev) #=> ctx
53
+ def self.create(arg1, arg2 = nil)
54
+ if arg2 != nil
55
+ flags, dev = arg1, arg2
56
+ flags = CUContextFlags.value(flags)
57
+ else
58
+ flags = 0
59
+ dev = arg1
60
+ end
61
+
62
+ p = FFI::MemoryPointer.new(:CUContext)
63
+ status = API::cuCtxCreate(p, flags, dev.to_api)
64
+ Pvt::handle_error(status, "Failed to create CUDA context: flags = #{flags}.")
65
+ new(p)
66
+ end
67
+
68
+
69
+ # Destroy this CUDA context.
70
+ def destroy
71
+ status = API::cuCtxDestroy(self.to_api)
72
+ Pvt::handle_error(status, "Failed to destroy CUDA context.")
73
+ nil
74
+ end
75
+
76
+
77
+ # @deprecated
78
+ #
79
+ # Increment the reference count on this CUDA context.
80
+ # @overload attach
81
+ # @overload attach(flags)
82
+ # @param [Integer] flags Currently _flags_ must be set to zero.
83
+ # @return [CUContext] This CUDA context.
84
+ def attach(flags = 0)
85
+ status = API::cuCtxAttach(@pcontext, flags)
86
+ Pvt::handle_error(status, "Failed to attach CUDA context: flags = #{flags}.")
87
+ self
88
+ end
89
+
90
+
91
+ # @deprecated
92
+ #
93
+ # Decrement the reference count on this CUDA context.
94
+ def detach
95
+ status = API::cuCtxDetach(self.to_api)
96
+ Pvt::handle_error(status, "Failed to detach CUDA context.")
97
+ nil
98
+ end
99
+
100
+
101
+ # @return [CUContext] The CUDA context bound to the calling CPU thread.
102
+ def self.current
103
+ p = FFI::MemoryPointer.new(:CUContext)
104
+ status = API::cuCtxGetCurrent(p)
105
+ Pvt::handle_error(status, "Failed to get the current CUDA context.")
106
+ new(p)
107
+ end
108
+
109
+
110
+ # Set the current CUDA context to _context_.
111
+ # @param [CUContext] The CUDA context to set as the current CUDA context.
112
+ def self.current=(context)
113
+ status = API::cuCtxSetCurrent(context.to_api)
114
+ Pvt::handle_error(status, "Failed to set the current CUDA context.")
115
+ end
116
+
117
+
118
+ # Push this CUDA context onto the CUDA context stack, which becomes currently active CUDA context.
119
+ # @return [CUContext] This CUDA context.
120
+ def push_current
121
+ status = API::cuCtxPushCurrent(self.to_api)
122
+ Pvt::handle_error(status, "Failed to push this CUDA context.")
123
+ self
124
+ end
125
+
126
+
127
+ # @return [Integer] The API version used to create this CUDA context.
128
+ def api_version
129
+ p = FFI::MemoryPointer.new(:uint)
130
+ status = API::cuCtxGetApiVersion(self.to_api, p)
131
+ Pvt::handle_error(status, "Failed to get the API version of this CUDA context.")
132
+ p.get_uint(0)
133
+ end
134
+
135
+
136
+ # @return [Integer] The API version used to create the current CUDA context.
137
+ def self.api_version
138
+ p = FFI::MemoryPointer.new(:uint)
139
+ status = API::cuCtxGetApiVersion(nil, p)
140
+ Pvt::handle_error(status, "Failed to get the API version of the current CUDA context.")
141
+ p.get_uint(0)
142
+ end
143
+
144
+
145
+ # @return [CUDevice] The device associated to the current CUDA context.
146
+ def self.device
147
+ p = FFI::MemoryPointer.new(:CUDevice)
148
+ status = API::cuCtxGetDevice(p)
149
+ Pvt::handle_error(status, "Failed to get the current CUDA context's device.")
150
+ CUDevice.send(:new, p)
151
+ end
152
+
153
+
154
+ # @param [CULimit] lim The particular limit attribute to query.
155
+ # @return [Integer] The limit _lim_ (CULimit) of the current CUDA context.
156
+ #
157
+ # @example Get the stack size limit.
158
+ # CUContext.limit(:STACK_SIZE) #=> 8192
159
+ def self.limit(lim)
160
+ p = FFI::MemoryPointer.new(:size_t)
161
+ status = API::cuCtxGetLimit(p, lim)
162
+ Pvt::handle_error(status, "Failed to get the current CUDA context limit: limit = #{lim}")
163
+ API::read_size_t(p)
164
+ end
165
+
166
+
167
+ # Set the limit _lim_ (CULimit) of the current CUDA context to _value_.
168
+ # @param [CULimit] lim The particular limit attribute to set.
169
+ # @param [Integer] value The value to set the limit to.
170
+ #
171
+ # @example Set the stack size limit.
172
+ # CUContext.limit = [:STACK_SIZE, 8192] #=> [:STACK_SIZE, 8192]
173
+ # CUContext.limit = :STACK_SIZE, 8192 #=> [:STACK_SIZE, 8192]
174
+ def self.limit=(*lim_val_pair)
175
+ lim, val = lim_val_pair.flatten
176
+ lim != nil && val != nil or raise ArgumentError, "Invalid limit and value pair given: limit = #{lim}, value = #{val}."
177
+ status = API::cuCtxSetLimit(lim, val)
178
+ Pvt::handle_error(status, "Failed to set the current CUDA context limit: limit = #{lim}, value = #{val}")
179
+ end
180
+
181
+
182
+ # @return [CUFunctionCache] The cache config of the current CUDA context.
183
+ #
184
+ # @example Get the cache config.
185
+ # CUContext.cache_config #=> :PREFER_NONE
186
+ def self.cache_config
187
+ p = FFI::MemoryPointer.new(:enum)
188
+ status = API::cuCtxGetCacheConfig(p)
189
+ Pvt::handle_error(status, "Failed to get the current CUDA context cache config.")
190
+ CUFunctionCache[API::read_enum(p)]
191
+ end
192
+
193
+
194
+ # Set the cache to _conf_ (CUFunctionCache) for the current CUDA context.
195
+ #
196
+ # @example Set the cache config to prefer shared.
197
+ # CUContext.cache_config = :PREFER_SHARED #=> :PREFER_SHARED
198
+ def self.cache_config=(conf)
199
+ status = API::cuCtxSetCacheConfig(conf)
200
+ Pvt::handle_error(status, "Failed to set the current CUDA context cache config: config = #{conf}")
201
+ end
202
+
203
+
204
+ # Pop the current CUDA context from the CUDA context stack, which becomes inactive.
205
+ def self.pop_current
206
+ p = FFI::MemoryPointer.new(:CUContext)
207
+ status = API::cuCtxPopCurrent(p)
208
+ Pvt::handle_error(status, "Failed to pop current context.")
209
+ new(p)
210
+ end
211
+
212
+
213
+ # Block until all the tasks of the current CUDA context complete.
214
+ def self.synchronize
215
+ status = API::cuCtxSynchronize
216
+ Pvt::handle_error(status, "Failed to synchronize the current context.")
217
+ nil
218
+ end
219
+
220
+
221
+ # @private
222
+ def initialize(ptr)
223
+ @pcontext = ptr
224
+ end
225
+ private_class_method(:new)
226
+
227
+
228
+ # @private
229
+ def to_api
230
+ API::read_cucontext(@pcontext)
231
+ end
232
+
233
+ end
234
+
235
+ end # module
236
+ end # module