opencl_ruby_ffi 0.95 → 0.96
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/lib/opencl_ruby_ffi.rb +2 -0
- data/lib/opencl_ruby_ffi/Buffer.rb +1 -1
- data/lib/opencl_ruby_ffi/CommandQueue.rb +138 -5
- data/lib/opencl_ruby_ffi/Context.rb +24 -5
- data/lib/opencl_ruby_ffi/Device.rb +17 -2
- data/lib/opencl_ruby_ffi/Image.rb +6 -6
- data/lib/opencl_ruby_ffi/Kernel.rb +41 -5
- data/lib/opencl_ruby_ffi/Mem.rb +5 -0
- data/lib/opencl_ruby_ffi/Pipe.rb +38 -0
- data/lib/opencl_ruby_ffi/Program.rb +15 -3
- data/lib/opencl_ruby_ffi/SVM.rb +184 -0
- data/lib/opencl_ruby_ffi/Sampler.rb +49 -5
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base.rb +3 -2
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base_gen.rb +232 -60
- data/opencl_ruby_ffi.gemspec +3 -3
- metadata +5 -3
data/lib/opencl_ruby_ffi.rb
CHANGED
@@ -15,7 +15,7 @@ module OpenCL
|
|
15
15
|
def self.create_buffer( context, size, options = {} )
|
16
16
|
flags = OpenCL.get_flags( options )
|
17
17
|
host_ptr = options[:host_ptr]
|
18
|
-
error = FFI::MemoryPointer
|
18
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
19
19
|
buff = OpenCL.clCreateBuffer(context, flags, size, host_ptr, error)
|
20
20
|
OpenCL.error_check(error.read_cl_int)
|
21
21
|
return OpenCL::Buffer::new( buff, false )
|
@@ -33,10 +33,36 @@ module OpenCL
|
|
33
33
|
# ==== Options
|
34
34
|
#
|
35
35
|
# * +:properties+ - a single or an Array of :cl_command_queue_properties
|
36
|
+
# * +:size+ - the size of the command queue ( if ON_DEVICE is specified in the properties ) 2.0+ only
|
36
37
|
def self.create_command_queue( context, device, options = {} )
|
37
38
|
properties = OpenCL.get_command_queue_properties( options )
|
39
|
+
size = options[:size]
|
38
40
|
error = FFI::MemoryPointer::new( :cl_int )
|
39
|
-
|
41
|
+
if context.platform.version_number < 2.0 then
|
42
|
+
cmd = OpenCL.clCreateCommandQueue( context, device, properties, error )
|
43
|
+
else
|
44
|
+
props = nil
|
45
|
+
if properties.to_i != 0 or size then
|
46
|
+
props_size = 0
|
47
|
+
props_size += 2 if properties.to_i != 0
|
48
|
+
props_size += 2 if size
|
49
|
+
props_size += 1 if props_size > 0
|
50
|
+
props = FFI::MemoryPointer::new( :cl_queue_properties, props_size )
|
51
|
+
i=0
|
52
|
+
if properties.to_i != 0 then
|
53
|
+
props[i].write_cl_queue_properties( OpenCL::Queue::PROPERTIES )
|
54
|
+
props[i+1].write_cl_queue_properties( properties.to_i )
|
55
|
+
i += 2
|
56
|
+
end
|
57
|
+
if size then
|
58
|
+
props[i].write_cl_queue_properties( OpenCL::Queue::SIZE )
|
59
|
+
props[i+1].write_cl_queue_properties( size )
|
60
|
+
i += 2
|
61
|
+
end
|
62
|
+
props[i].write_cl_queue_properties( 0 )
|
63
|
+
end
|
64
|
+
cmd = OpenCL.clCreateCommandQueueWithProperties( context, device, props, error )
|
65
|
+
end
|
40
66
|
OpenCL.error_check(error.read_cl_int)
|
41
67
|
return OpenCL::CommandQueue::new(cmd, false)
|
42
68
|
end
|
@@ -111,13 +137,13 @@ module OpenCL
|
|
111
137
|
image_slice_pitch = FFI::MemoryPointer::new( :size_t )
|
112
138
|
event = FFI::MemoryPointer::new( OpenCL::Event )
|
113
139
|
error = FFI::MemoryPointer::new( :cl_int )
|
114
|
-
OpenCL.clEnqueueMapImage( command_queue, image, blocking, flags, origin, region, image_row_pitch, image_slice_pitch, num_events, events, event, error )
|
140
|
+
ptr = OpenCL.clEnqueueMapImage( command_queue, image, blocking, flags, origin, region, image_row_pitch, image_slice_pitch, num_events, events, event, error )
|
115
141
|
OpenCL.error_check( error.read_cl_int )
|
116
142
|
ev = OpenCL::Event::new( event.read_ptr, false )
|
117
143
|
return [ev, ptr, image_row_pitch.read_size_t, image_slice_pitch.read_size_t]
|
118
144
|
end
|
119
145
|
|
120
|
-
# Enqueues a command to map
|
146
|
+
# Enqueues a command to map aa Buffer into host memory
|
121
147
|
#
|
122
148
|
# ==== Attributes
|
123
149
|
#
|
@@ -151,7 +177,7 @@ module OpenCL
|
|
151
177
|
num_events, events = OpenCL.get_event_wait_list( options )
|
152
178
|
event = FFI::MemoryPointer::new( OpenCL::Event )
|
153
179
|
error = FFI::MemoryPointer::new( :cl_int )
|
154
|
-
ptr = OpenCL.clEnqueueMapBuffer( command_queue, buffer, blocking, flags, offset, size, num_events, events, error )
|
180
|
+
ptr = OpenCL.clEnqueueMapBuffer( command_queue, buffer, blocking, flags, offset, size, num_events, events, event, error )
|
155
181
|
OpenCL.error_check( error.read_cl_int )
|
156
182
|
ev = OpenCL::Event::new( event.read_ptr, false )
|
157
183
|
return [ev, ptr]
|
@@ -1030,6 +1056,11 @@ module OpenCL
|
|
1030
1056
|
# Returns the reference count of the CommandQueue
|
1031
1057
|
eval OpenCL.get_info("CommandQueue", :cl_uint, "REFERENCE_COUNT")
|
1032
1058
|
|
1059
|
+
##
|
1060
|
+
# :method: size
|
1061
|
+
# Returns the currently specified size for the command queue (2.0 and for device queue only)
|
1062
|
+
eval OpenCL.get_info("CommandQueue", :cl_uint, "SIZE")
|
1063
|
+
|
1033
1064
|
##
|
1034
1065
|
# :method: properties
|
1035
1066
|
# Returns the :cl_command_queue_properties used to create the CommandQueue
|
@@ -1477,7 +1508,7 @@ module OpenCL
|
|
1477
1508
|
return OpenCL.enqueue_release_GL_object( self, mem_objects, options )
|
1478
1509
|
end
|
1479
1510
|
|
1480
|
-
# Enqueues a command to map
|
1511
|
+
# Enqueues a command to map a Buffer into host memory using the CommandQueue
|
1481
1512
|
#
|
1482
1513
|
# ==== Attributes
|
1483
1514
|
#
|
@@ -1597,6 +1628,108 @@ module OpenCL
|
|
1597
1628
|
return OpenCL.flush( self )
|
1598
1629
|
end
|
1599
1630
|
|
1631
|
+
# Enqueues a command to copy from or to an SVMPointer using the CommandQueue
|
1632
|
+
#
|
1633
|
+
# ==== Attributes
|
1634
|
+
#
|
1635
|
+
# * +dst_ptr+ - the Pointer (or convertible to Pointer using to_ptr) or SVMPointer to be written to
|
1636
|
+
# * +src_ptr+ - the Pointer (or convertible to Pointer using to_ptr) or SVMPointer to be read from
|
1637
|
+
# * +size+ - the size of data to copy
|
1638
|
+
# * +options+ - a hash containing named options
|
1639
|
+
#
|
1640
|
+
# ==== Options
|
1641
|
+
#
|
1642
|
+
# * +:event_wait_list+ - if provided, a list of Event to wait upon before executing the command
|
1643
|
+
# * +:blocking_copy+ - if provided indicates if the command blocks until the copy finishes
|
1644
|
+
# * +:blocking+ - if provided indicates if the command blocks until the copy finishes
|
1645
|
+
#
|
1646
|
+
# ==== Returns
|
1647
|
+
#
|
1648
|
+
# the Event associated with the command
|
1649
|
+
def enqueue_svm_memcpy( dst_ptr, src_ptr, size, options = {})
|
1650
|
+
return OpenCL.enqueue_svm_memcpy(self, dst_ptr, src_ptr, size, options)
|
1651
|
+
end
|
1652
|
+
|
1653
|
+
# Enqueues a command that frees SVMPointers (or Pointers using a callback) using the CommandQueue
|
1654
|
+
#
|
1655
|
+
# ==== Attributes
|
1656
|
+
#
|
1657
|
+
# * +svm_pointer+ - a single or an Array of SVMPointer (or Pointer)
|
1658
|
+
# * +options+ - a hash containing named options
|
1659
|
+
# * +block+ - if provided, a callback invoked to free the pointers. Signature of the callback is { |CommandQueue, num_pointers, FFI::Pointer to an array of num_pointers Pointers, FFI::Pointer to user_data| ... }
|
1660
|
+
#
|
1661
|
+
# ==== Options
|
1662
|
+
#
|
1663
|
+
# * +:event_wait_list+ - if provided, a list of Event to wait upon before executing the command
|
1664
|
+
# * +:user_data+ - if provided, a Pointer (or convertible to using to_ptr) that will be passed to the callback
|
1665
|
+
#
|
1666
|
+
# ==== Returns
|
1667
|
+
#
|
1668
|
+
# the Event associated with the command
|
1669
|
+
def enqueue_svm_free(svm_pointers, options = {}, &block)
|
1670
|
+
return OpenCL.enqueue_svm_free(self, svm_pointers, options, &block)
|
1671
|
+
end
|
1672
|
+
|
1673
|
+
# Enqueues a command to fill a an SVM memory area using the CommandQueue
|
1674
|
+
#
|
1675
|
+
# ==== Attributes
|
1676
|
+
#
|
1677
|
+
# * +svm_ptr+ - the SVMPointer to the area to fill
|
1678
|
+
# * +pattern+ - the Pointer (or convertible to Pointer using to_ptr) to the memory area where the pattern is stored
|
1679
|
+
# * +size+ - the size of the area to fill
|
1680
|
+
#
|
1681
|
+
# ==== Options
|
1682
|
+
#
|
1683
|
+
# * +:event_wait_list+ - if provided, a list of Event to wait upon before executing the command
|
1684
|
+
# * +:pattern_size+ - if provided indicates the size of the pattern, else the maximum pattern data is used
|
1685
|
+
#
|
1686
|
+
# ==== Returns
|
1687
|
+
#
|
1688
|
+
# the Event associated with the command
|
1689
|
+
def enqueue_svm_fill(command_queue, svm_ptr, pattern, size, options = {})
|
1690
|
+
return OpenCL.enqueue_svm_fill(self, svm_ptr, pattern, size, options)
|
1691
|
+
end
|
1692
|
+
|
1693
|
+
# Enqueues a command to map an Image into host memory using the CommandQueue
|
1694
|
+
#
|
1695
|
+
# ==== Attributes
|
1696
|
+
#
|
1697
|
+
# * +svm_ptr+ - the SVMPointer to the area to map
|
1698
|
+
# * +size+ - the size of the region to map
|
1699
|
+
# * +map_flags+ - a single or an Array of :cl_map_flags flags
|
1700
|
+
# * +options+ - a hash containing named options
|
1701
|
+
#
|
1702
|
+
# ==== Options
|
1703
|
+
#
|
1704
|
+
# * +:event_wait_list+ - if provided, a list of Event to wait upon before executing the command
|
1705
|
+
# * +:blocking_map+ - if provided indicates if the command blocks until the region is mapped
|
1706
|
+
# * +:blocking+ - if provided indicates if the command blocks until the region is mapped
|
1707
|
+
#
|
1708
|
+
# ==== Returns
|
1709
|
+
#
|
1710
|
+
# the Event associated with the command
|
1711
|
+
def enqueue_svm_map( svm_ptr, size, map_flags, options = {} )
|
1712
|
+
return OpenCL.enqueue_svm_map( self, svm_ptr, size, map_flags, options )
|
1713
|
+
end
|
1714
|
+
|
1715
|
+
# Enqueues a command to unmap a previously mapped SVM memory area using the CommandQueue
|
1716
|
+
#
|
1717
|
+
# ==== Attributes
|
1718
|
+
#
|
1719
|
+
# * +svm_ptr+ - the SVMPointer of the area to be unmapped
|
1720
|
+
# * +options+ - a hash containing named options
|
1721
|
+
#
|
1722
|
+
# ==== Options
|
1723
|
+
#
|
1724
|
+
# * +:event_wait_list+ - if provided, a list of Event to wait upon before executing the command
|
1725
|
+
#
|
1726
|
+
# ==== Returns
|
1727
|
+
#
|
1728
|
+
# the Event associated with the command
|
1729
|
+
def enqueue_svm_unmap( svm_ptr, options = {} )
|
1730
|
+
return OpenCL.enqueue_svm_unmap( self, svm_ptr, options )
|
1731
|
+
end
|
1732
|
+
|
1600
1733
|
end
|
1601
1734
|
|
1602
1735
|
end
|
@@ -129,6 +129,7 @@ module OpenCL
|
|
129
129
|
# ==== Options
|
130
130
|
#
|
131
131
|
# * +:properties+ - a single or an Array of :cl_command_queue_properties
|
132
|
+
# * +:size+ - the size of the command queue ( if ON_DEVICE is specified in the properties ) 2.0+ only
|
132
133
|
def create_command_queue( device, options = {} )
|
133
134
|
return OpenCL.create_command_queue( self, device, options )
|
134
135
|
end
|
@@ -350,14 +351,32 @@ module OpenCL
|
|
350
351
|
|
351
352
|
# Creates a Sampler in the Context
|
352
353
|
#
|
354
|
+
# ==== Options
|
355
|
+
#
|
356
|
+
# * +:normalized_coords+ - a :cl_bool specifying if the image coordinates are normalized
|
357
|
+
# * +:addressing_mode+ - a :cl_addressing_mode specifying how out-of-range image coordinates are handled when reading from an image
|
358
|
+
# * +:filter_mode+ - a :cl_filter_mode specifying the type of filter that must be applied when reading an image
|
359
|
+
# * +:mip_filter_mode+ - the filtering mode to use if using mimaps (default CL_FILTER_NONE, requires cl_khr_mipmap_image)
|
360
|
+
# * +:lod_min+ - floating point value representing the minimal LOD (default 0.0f, requires cl_khr_mipmap_image)
|
361
|
+
# * +:lod_max+ - floating point value representing the maximal LOD (default MAXFLOAT, requires cl_khr_mipmap_image)
|
362
|
+
def create_sampler( options = {} )
|
363
|
+
return OpenCL.create_sampler( self, options )
|
364
|
+
end
|
365
|
+
|
366
|
+
# Creates a Pipe in the Context
|
367
|
+
#
|
353
368
|
# ==== Attributes
|
354
369
|
#
|
355
|
-
# * +
|
356
|
-
# * +
|
357
|
-
#
|
358
|
-
|
359
|
-
|
370
|
+
# * +pipe_packet_size+ - size of a packet in the Pipe
|
371
|
+
# * +pipe_max_packets+ - size of the Pipe in packet
|
372
|
+
#
|
373
|
+
# ==== Options
|
374
|
+
#
|
375
|
+
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the Buffer
|
376
|
+
def create_pipe( pipe_packet_size, pipe_max_packets, opts = {} )
|
377
|
+
return OpenCL.create_pipe( self, pipe_packet_size, pipe_max_packets, opts )
|
360
378
|
end
|
379
|
+
|
361
380
|
end
|
362
381
|
|
363
382
|
end
|
@@ -68,11 +68,11 @@ module OpenCL
|
|
68
68
|
eval OpenCL.get_info("Device", :cl_ulong, prop)
|
69
69
|
}
|
70
70
|
|
71
|
-
%w( IMAGE_PITCH_ALIGNMENT IMAGE_BASE_ADDRESS_ALIGNMENT REFERENCE_COUNT PARTITION_MAX_SUB_DEVICES VENDOR_ID PREFERRED_VECTOR_WIDTH_HALF PREFERRED_VECTOR_WIDTH_CHAR PREFERRED_VECTOR_WIDTH_SHORT PREFERRED_VECTOR_WIDTH_INT PREFERRED_VECTOR_WIDTH_LONG PREFERRED_VECTOR_WIDTH_FLOAT PREFERRED_VECTOR_WIDTH_DOUBLE NATIVE_VECTOR_WIDTH_CHAR NATIVE_VECTOR_WIDTH_SHORT NATIVE_VECTOR_WIDTH_INT NATIVE_VECTOR_WIDTH_LONG NATIVE_VECTOR_WIDTH_FLOAT NATIVE_VECTOR_WIDTH_DOUBLE NATIVE_VECTOR_WIDTH_HALF MIN_DATA_TYPE_ALIGN_SIZE MEM_BASE_ADDR_ALIGN MAX_WRITE_IMAGE_ARGS MAX_WORK_ITEM_DIMENSIONS MAX_SAMPLERS MAX_READ_IMAGE_ARGS MAX_CONSTANT_ARGS MAX_COMPUTE_UNITS MAX_CLOCK_FREQUENCY ADDRESS_BITS GLOBAL_MEM_CACHELINE_SIZE ).each { |prop|
|
71
|
+
%w( IMAGE_PITCH_ALIGNMENT IMAGE_BASE_ADDRESS_ALIGNMENT REFERENCE_COUNT PARTITION_MAX_SUB_DEVICES VENDOR_ID PREFERRED_VECTOR_WIDTH_HALF PREFERRED_VECTOR_WIDTH_CHAR PREFERRED_VECTOR_WIDTH_SHORT PREFERRED_VECTOR_WIDTH_INT PREFERRED_VECTOR_WIDTH_LONG PREFERRED_VECTOR_WIDTH_FLOAT PREFERRED_VECTOR_WIDTH_DOUBLE NATIVE_VECTOR_WIDTH_CHAR NATIVE_VECTOR_WIDTH_SHORT NATIVE_VECTOR_WIDTH_INT NATIVE_VECTOR_WIDTH_LONG NATIVE_VECTOR_WIDTH_FLOAT NATIVE_VECTOR_WIDTH_DOUBLE NATIVE_VECTOR_WIDTH_HALF MIN_DATA_TYPE_ALIGN_SIZE MEM_BASE_ADDR_ALIGN MAX_WRITE_IMAGE_ARGS MAX_READ_WRITE_IMAGE_ARGS MAX_WORK_ITEM_DIMENSIONS MAX_SAMPLERS MAX_READ_IMAGE_ARGS MAX_CONSTANT_ARGS MAX_COMPUTE_UNITS MAX_CLOCK_FREQUENCY ADDRESS_BITS GLOBAL_MEM_CACHELINE_SIZE QUEUE_ON_DEVICE_PREFERRED_SIZE QUEUE_ON_DEVICE_MAX_SIZE MAX_ON_DEVICE_QUEUES MAX_ON_DEVICE_EVENTS MAX_PIPE_ARGS PIPE_MAX_ACTIVE_RESERVATIONS PIPE_MAX_PACKET_SIZE PREFERRED_PLATFORM_ATOMIC_ALIGNMENT PREFERRED_GLOBAL_ATOMIC_ALIGNMENT PREFERRED_LOCAL_ATOMIC_ALIGNMENT).each { |prop|
|
72
72
|
eval OpenCL.get_info("Device", :cl_uint, prop)
|
73
73
|
}
|
74
74
|
|
75
|
-
%w( PRINTF_BUFFER_SIZE IMAGE_MAX_BUFFER_SIZE IMAGE_MAX_ARRAY_SIZE PROFILING_TIMER_RESOLUTION MAX_WORK_GROUP_SIZE MAX_PARAMETER_SIZE IMAGE2D_MAX_WIDTH IMAGE2D_MAX_HEIGHT IMAGE3D_MAX_WIDTH IMAGE3D_MAX_HEIGHT IMAGE3D_MAX_DEPTH ).each { |prop|
|
75
|
+
%w( PRINTF_BUFFER_SIZE IMAGE_MAX_BUFFER_SIZE IMAGE_MAX_ARRAY_SIZE PROFILING_TIMER_RESOLUTION MAX_WORK_GROUP_SIZE MAX_PARAMETER_SIZE IMAGE2D_MAX_WIDTH IMAGE2D_MAX_HEIGHT IMAGE3D_MAX_WIDTH IMAGE3D_MAX_HEIGHT IMAGE3D_MAX_DEPTH MAX_GLOBAL_VARIABLE_SIZE GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE).each { |prop|
|
76
76
|
eval OpenCL.get_info("Device", :size_t, prop)
|
77
77
|
}
|
78
78
|
|
@@ -104,6 +104,16 @@ module OpenCL
|
|
104
104
|
# Returns a CommandQueue::Properties representing the properties supported by a CommandQueue targetting the Device
|
105
105
|
eval OpenCL.get_info("Device", :cl_command_queue_properties, "QUEUE_PROPERTIES")
|
106
106
|
|
107
|
+
##
|
108
|
+
# :method: queue_on_device_properties()
|
109
|
+
# Returns a CommandQueue::Properties representing the properties supported by a CommandQueue on the Device
|
110
|
+
eval OpenCL.get_info("Device", :cl_command_queue_properties, "QUEUE_ON_DEVICE_PROPERTIES")
|
111
|
+
|
112
|
+
##
|
113
|
+
# :method: queue_on_host_properties()
|
114
|
+
# Returns a CommandQueue::Properties representing the properties supported by a CommandQueue targetting the Device
|
115
|
+
eval OpenCL.get_info("Device", :cl_command_queue_properties, "QUEUE_ON_HOST_PROPERTIES")
|
116
|
+
|
107
117
|
##
|
108
118
|
# :method: type()
|
109
119
|
# Returns a Device::Type representing the type of the Device
|
@@ -124,6 +134,11 @@ module OpenCL
|
|
124
134
|
# Returns the list of partition types supported by the Device
|
125
135
|
eval OpenCL.get_info_array("Device", :cl_device_partition_property, "PARTITION_PROPERTIES")
|
126
136
|
|
137
|
+
##
|
138
|
+
# :method: svm_capabilities()
|
139
|
+
# Returns an SVMCapabilities representing the the SVM capabilities corresponding to the device
|
140
|
+
eval OpenCL.get_info_array("Device", :cl_device_svm_capabilities, "SVM_CAPABILITIES")
|
141
|
+
|
127
142
|
# Return an Array of partition properties names representing the partition type supported by the device
|
128
143
|
def partition_properties_names
|
129
144
|
prop_names = []
|
@@ -6,11 +6,11 @@ module OpenCL
|
|
6
6
|
#
|
7
7
|
# * +context+ - Context the created Image will be associated to
|
8
8
|
# * +format+ - an ImageFormat
|
9
|
-
# * +
|
9
|
+
# * +desc+ - an ImageDesc
|
10
10
|
#
|
11
11
|
# ==== Options
|
12
12
|
#
|
13
|
-
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the
|
13
|
+
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the Image
|
14
14
|
# * +:host_ptr+ - if provided, the Pointer (or convertible to Pointer using to_ptr) to the memory area to use
|
15
15
|
def self.create_image( context, format, desc, options = {} )
|
16
16
|
flags = OpenCL.get_flags( options )
|
@@ -31,9 +31,9 @@ module OpenCL
|
|
31
31
|
#
|
32
32
|
# ==== Options
|
33
33
|
#
|
34
|
-
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the
|
34
|
+
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the Image
|
35
35
|
# * +:host_ptr+ - if provided, the Pointer (or convertible to Pointer using to_ptr) to the memory area to use
|
36
|
-
def self.create_image_1D( context, format, width, options )
|
36
|
+
def self.create_image_1D( context, format, width, options = {} )
|
37
37
|
if context.platform.version_number > 1.1 then
|
38
38
|
desc = OpenCL::ImageDesc::new(OpenCL::Mem::IMAGE1D, width, 0, 0, 0, 0, 0, 0, 0, nil)
|
39
39
|
return OpenCL.create_image( context, format, desc, options )
|
@@ -52,7 +52,7 @@ module OpenCL
|
|
52
52
|
#
|
53
53
|
# ==== Options
|
54
54
|
#
|
55
|
-
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the
|
55
|
+
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the Image
|
56
56
|
# * +:host_ptr+ - if provided, the Pointer (or convertible to Pointer using to_ptr) to the memory area to use
|
57
57
|
# * +:row_pitch+ - if provided the row_pitch of data in host_ptr
|
58
58
|
def self.create_image_2D( context, format, width, height, options = {} )
|
@@ -80,7 +80,7 @@ module OpenCL
|
|
80
80
|
#
|
81
81
|
# ==== Options
|
82
82
|
#
|
83
|
-
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the
|
83
|
+
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the Image
|
84
84
|
# * +:host_ptr+ - if provided, the Pointer (or convertible to Pointer using to_ptr) to the memory area to use
|
85
85
|
# * +:row_pitch+ - if provided the row_pitch of data in host_ptr
|
86
86
|
# * +:slice_pitch+ - if provided the slice_pitch of data in host_ptr
|
@@ -16,9 +16,9 @@ module OpenCL
|
|
16
16
|
|
17
17
|
# Returns the Kernel corresponding the the specified name in the given Program
|
18
18
|
def self.create_kernel(program, name)
|
19
|
-
|
20
|
-
kernel_ptr = OpenCL.clCreateKernel(program, name,
|
21
|
-
OpenCL.error_check(
|
19
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
20
|
+
kernel_ptr = OpenCL.clCreateKernel(program, name, error)
|
21
|
+
OpenCL.error_check(error.read_cl_int)
|
22
22
|
return OpenCL::Kernel::new( kernel_ptr, false )
|
23
23
|
end
|
24
24
|
|
@@ -104,7 +104,11 @@ module OpenCL
|
|
104
104
|
|
105
105
|
# Sets this Arg to value. The size of value can be specified.
|
106
106
|
def set(value, size = nil)
|
107
|
-
OpenCL
|
107
|
+
if value.class == OpenCL::SVMPointer and @kernel.context.platform.version_number >= 2.0 then
|
108
|
+
OpenCL.set_kernel_arg_svm_pointer( @kernel, @index, value )
|
109
|
+
else
|
110
|
+
OpenCL.set_kernel_arg(@kernel, @index, value, size)
|
111
|
+
end
|
108
112
|
end
|
109
113
|
|
110
114
|
end
|
@@ -119,6 +123,29 @@ module OpenCL
|
|
119
123
|
return a
|
120
124
|
end
|
121
125
|
|
126
|
+
# Specifies the list of SVM pointers the kernel will be using
|
127
|
+
def set_svm_ptrs( ptrs )
|
128
|
+
OpenCL.error_check(OpenCL::INVALID_OPERATION) if self.context.platform.version_number < 2.0
|
129
|
+
pointers = [ptrs].flatten
|
130
|
+
pt = FFI::MemoryPointer::new( :pointer, pointers.length )
|
131
|
+
pointers.each_with_index { |p, i|
|
132
|
+
pt[i].write_pointer(p)
|
133
|
+
}
|
134
|
+
error = OpenCL.clSetKernelExecInfo( self, OpenCL::Kernel::EXEC_INFO_SVM_PTRS, pt.size, pt)
|
135
|
+
OpenCL.error_check(error)
|
136
|
+
return self
|
137
|
+
end
|
138
|
+
|
139
|
+
# Specifies the granularity of the SVM system.
|
140
|
+
def set_svm_fine_grain_system( flag )
|
141
|
+
OpenCL.error_check(OpenCL::INVALID_OPERATION) if self.context.platform.version_number < 2.0
|
142
|
+
pt = FFI::MemoryPointer::new( :cl_bool )
|
143
|
+
pt.write_cl_bool( flag )
|
144
|
+
error = OpenCL.clSetKernelExecInfo( self, OpenCL::Kernel::EXEC_INFO_SVM_FINE_GRAIN_SYSTEL, pt.size, pt)
|
145
|
+
OpenCL.error_check(error)
|
146
|
+
return self
|
147
|
+
end
|
148
|
+
|
122
149
|
##
|
123
150
|
# :method: function_name()
|
124
151
|
# returns a String correspondig to the Kernel function name
|
@@ -164,6 +191,11 @@ module OpenCL
|
|
164
191
|
OpenCL.set_kernel_arg(self, index, value, size)
|
165
192
|
end
|
166
193
|
|
194
|
+
# Set the index th argument of the Kernel to an svm pointer value.
|
195
|
+
def set_arg_svm_pointer(index, svm_pointer)
|
196
|
+
OpenCL.set_kernel_arg_svm_pointer(self, index, svm_pointer)
|
197
|
+
end
|
198
|
+
|
167
199
|
# Enqueues the Kernel in the given queue, specifying the global_work_size. Arguments for the kernel are specified afterwards. Last, a hash containing options for enqueuNDrange kernel can be specified
|
168
200
|
def enqueue_with_args(command_queue, global_work_size, *args)
|
169
201
|
n = self.num_args
|
@@ -175,7 +207,11 @@ module OpenCL
|
|
175
207
|
options = {}
|
176
208
|
end
|
177
209
|
n.times { |i|
|
178
|
-
|
210
|
+
if args[i].class == OpenCL::SVMPointer and self.context.platform.version_number >= 2.0 then
|
211
|
+
self.set_arg_svm_pointer(i, args[i])
|
212
|
+
else
|
213
|
+
self.set_arg(i, args[i])
|
214
|
+
end
|
179
215
|
}
|
180
216
|
command_queue.enqueue_NDrange_kernel(self, global_work_size, options)
|
181
217
|
end
|
data/lib/opencl_ruby_ffi/Mem.rb
CHANGED
@@ -65,6 +65,11 @@ module OpenCL
|
|
65
65
|
eval OpenCL.get_info("Mem", :cl_uint, prop)
|
66
66
|
}
|
67
67
|
|
68
|
+
##
|
69
|
+
# :method: uses_svn_pointer()
|
70
|
+
# Returns true if Mem uses an SVM pointer
|
71
|
+
eval OpenCL.get_info("Mem", :cl_bool, "USES_SVM_POINTER")
|
72
|
+
|
68
73
|
##
|
69
74
|
# :method: type()
|
70
75
|
# Returns an OpenCL::Mem::Type corresponding to the Mem
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module OpenCL
|
2
|
+
|
3
|
+
# Creates a Pipe
|
4
|
+
#
|
5
|
+
# ==== Attributes
|
6
|
+
#
|
7
|
+
# * +context+ - Context the created Pipe will be associated to
|
8
|
+
# * +pipe_packet_size+ - size of a packet in the Pipe
|
9
|
+
# * +pipe_max_packets+ - size of the Pipe in packet
|
10
|
+
#
|
11
|
+
# ==== Options
|
12
|
+
#
|
13
|
+
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the Pipe
|
14
|
+
def self.create_pipe( context, pipe_packet_size, pipe_max_packets, options = {} )
|
15
|
+
OpenCL.error_check(OpenCL::INVALID_OPERATION) if self.context.platform.version_number < 2.0
|
16
|
+
flags = OpenCL.get_flags( options )
|
17
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
18
|
+
pipe_ptr = OpenCL::clCreatePipe( context, flags, pipe_packet_size, pipe_max_packets, nil, error)
|
19
|
+
OpenCL.error_check(error.read_cl_int)
|
20
|
+
return OpenCL::Pipe::new(pipe_ptr, false)
|
21
|
+
end
|
22
|
+
|
23
|
+
class Pipe
|
24
|
+
|
25
|
+
##
|
26
|
+
# :method: packet_size
|
27
|
+
# Returns the packet_size of the Pipe
|
28
|
+
|
29
|
+
##
|
30
|
+
# :method: max_packets
|
31
|
+
# Returns the max_packets of the Pipe
|
32
|
+
%w( PACKET_SIZE MAX_PACKETS ).each { |prop|
|
33
|
+
eval OpenCL.get_info("Pipe", :cl_uint, prop)
|
34
|
+
}
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|