|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +require 'optparse' |
| 4 | + |
| 5 | +options = { platform: 0, device: 0 } |
| 6 | +OptionParser.new do |parser| |
| 7 | + parser.banner = "Usage: ruby #{File.basename($PROGRAM_NAME)} [options]" |
| 8 | + parser.on('-p', '--platform INDEX', Integer, 'Index of the platform to use (default 0)') |
| 9 | + parser.on('-d', '--device INDEX', Integer, 'Index of the device to use (default 0)') |
| 10 | +end.parse!(into: options) |
| 11 | + |
| 12 | +require 'opencl_ruby_ffi' |
| 13 | +require 'narray_ffi' |
| 14 | + |
| 15 | +kernel_string = <<~CLC |
| 16 | + kernel void CopyBuffer( global uint* dst, global uint* src ) |
| 17 | + { |
| 18 | + uint id = get_global_id(0); |
| 19 | + dst[id] = src[id]; |
| 20 | + } |
| 21 | +CLC |
| 22 | + |
| 23 | +buffer_size = 1024 * 1024 |
| 24 | + |
| 25 | +p = OpenCL.platforms[options[:platform]] |
| 26 | +raise "Invalid platform index #{options[:platform]}" unless p |
| 27 | + |
| 28 | +d = p.devices[options[:device]] |
| 29 | +raise "Invalid device index #{options[:device]}" unless d |
| 30 | + |
| 31 | +puts "Running on platform: #{p.name}" |
| 32 | +puts "Running on device: #{d.name}" |
| 33 | + |
| 34 | +begin |
| 35 | + c = OpenCL.create_context(d) |
| 36 | + q = c.create_command_queue(d) |
| 37 | + |
| 38 | + program = c.create_program_with_source(kernel_string) |
| 39 | + program.build |
| 40 | + device_src = c.create_buffer(buffer_size * OpenCL::UInt.size, flags: OpenCL::Mem::ALLOC_HOST_PTR) |
| 41 | + device_dst = c.create_buffer(buffer_size * OpenCL::UInt.size, flags: OpenCL::Mem::ALLOC_HOST_PTR) |
| 42 | + |
| 43 | + _, host_ptr = q.enqueue_map_buffer(device_src, OpenCL::MapFlags::WRITE_INVALIDATE_REGION, blocking: true) |
| 44 | + arr = NArray.to_na(host_ptr, NArray::INT) |
| 45 | + buffer_size.times { |i| arr[i] = i } |
| 46 | + q.enqueue_unmap_mem_object(device_src, host_ptr) |
| 47 | + |
| 48 | + program.CopyBuffer(q, [buffer_size], device_dst, device_src) |
| 49 | + |
| 50 | + _, host_ptr = q.enqueue_map_buffer(device_dst, OpenCL::MapFlags::READ, blocking: true) |
| 51 | + arr = NArray.to_na(host_ptr, NArray::INT) |
| 52 | + buffer_size.times do |i| |
| 53 | + raise "invalid copy: wanted #{i}, got #{arr[i]}" unless arr[i] == i |
| 54 | + end |
| 55 | + q.enqueue_unmap_mem_object(device_dst, host_ptr) |
| 56 | + |
| 57 | + puts 'Success.' |
| 58 | +rescue OpenCL::Error::BUILD_PROGRAM_FAILURE |
| 59 | + puts 'Compilation of program failed:' |
| 60 | + program.build_log.each do |device, log| |
| 61 | + puts " - #{device.name}:" |
| 62 | + puts log |
| 63 | + end |
| 64 | + puts 'Expected Failure on MacOS...' |
| 65 | +end |
0 commit comments