numo-openblas 0.1.1 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 69ec5184f3c04827324d0fd0d5af5e9b92dd61b7710df099df26379525a48f09
4
- data.tar.gz: 41fcc9d0a64991fe1e43d43467c6a98138fd3fa195428e2fb1663ffa571fccca
3
+ metadata.gz: eb28541f7f6f87b87410da68933898703b42d2987721e429b4d09ac7f1d23127
4
+ data.tar.gz: ea7a198b2c3d3c17c7b03898d9c9b31a4c747335401b521ae4415c63b7a45c74
5
5
  SHA512:
6
- metadata.gz: 86d775545a967607cfce5c4e824a220224822a05fd2a5796eaa9e9a380b8c909829cf8b2d5e394349b6ff65a75d34729393bab8b25949afe2b9090c415373969
7
- data.tar.gz: 158f89106e2611e1fdc29ce9c97f1b235c966eac637523230dca4a14db449febd18b32a7c42416cce973a1c34328b098b9e004f8670001489c8acfe7d0860e3f
6
+ metadata.gz: a2eec31d62b6cd6ee263b9219356835cb60fe52562dc2ab8090e7cb8261fa10de28eeb0c007a23d522def8af23a4d7d039ac5437f11270b2bc3e896e529ad645
7
+ data.tar.gz: dc3b17590715bf76411eb71e29b9cad3afea8c5ae13b57070638d55b63460e17914c0142428ebbf2ab71853e6d94f9e56e183f175c8378737037fb7d557d5d8b
@@ -1,3 +1,7 @@
1
+ ## 0.2.0
2
+ - Add constant values about OpenBLAS.
3
+ - Change to download and build OpenBLAS when building native extension.
4
+
1
5
  ## 0.1.1
2
6
  - Fix to check downloaded file's SHA1.
3
7
 
data/Gemfile CHANGED
@@ -4,4 +4,5 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  gem 'rake', '~> 12.0'
7
+ gem 'rake-compiler', '~> 1.0'
7
8
  gem 'rspec', '~> 3.0'
data/Rakefile CHANGED
@@ -3,4 +3,13 @@ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ require 'rake/extensiontask'
7
+
8
+ task build: :compile
9
+
10
+ Rake::ExtensionTask.new('openblas') do |ext|
11
+ ext.ext_dir = 'ext/numo/openblas'
12
+ ext.lib_dir = 'lib/numo/openblas'
13
+ end
14
+
15
+ task default: %i[clobber compile spec]
@@ -0,0 +1,76 @@
1
+ # frozen-string-literal: true
2
+
3
+ require 'digest/sha1'
4
+ require 'etc'
5
+ require 'fileutils'
6
+ require 'mkmf'
7
+ require 'open-uri'
8
+ require 'open3'
9
+ require 'rubygems/package'
10
+
11
+ OPENBLAS_VER = '0.3.10'
12
+ OPENBLAS_KEY = 'cbe3fdd0e6ee235debc611d76976dac62f3ddc1c'
13
+ OPENBLAS_URI = "https://github.com/xianyi/OpenBLAS/archive/v#{OPENBLAS_VER}.tar.gz"
14
+ OPENBLAS_DIR = File.expand_path(__dir__ + '/../../../vendor')
15
+
16
+ unless File.exist?("#{OPENBLAS_DIR}/installed_#{OPENBLAS_VER}")
17
+ puts "Downloading OpenBLAS #{OPENBLAS_VER}."
18
+ URI.open(OPENBLAS_URI) do |rf|
19
+ File.open("#{OPENBLAS_DIR}/tmp/openblas.tgz", 'wb') { |sf| sf.write(rf.read) }
20
+ end
21
+
22
+ if OPENBLAS_KEY != Digest::SHA1.file("#{OPENBLAS_DIR}/tmp/openblas.tgz").to_s
23
+ puts 'SHA1 digest of downloaded file does not match.'
24
+ exit(1)
25
+ end
26
+
27
+ puts 'Unpacking OpenBLAS tar.gz file.'
28
+ Gem::Package::TarReader.new(Zlib::GzipReader.open("#{OPENBLAS_DIR}/tmp/openblas.tgz")) do |tar|
29
+ tar.each do |entry|
30
+ next unless entry.file?
31
+
32
+ filename = "#{OPENBLAS_DIR}/tmp/#{entry.full_name}"
33
+ next if filename == File.dirname(filename)
34
+
35
+ FileUtils.mkdir_p("#{OPENBLAS_DIR}/tmp/#{File.dirname(entry.full_name)}")
36
+ File.open(filename, 'wb') { |f| f.write(entry.read) }
37
+ File.chmod(entry.header.mode, filename)
38
+ end
39
+ end
40
+
41
+ Dir.chdir("#{OPENBLAS_DIR}/tmp/OpenBLAS-#{OPENBLAS_VER}") do
42
+ puts 'Building OpenBLAS. This could take a while...'
43
+ mkstdout, _mkstderr, mkstatus = Open3.capture3("make -j#{Etc.nprocessors}")
44
+ File.open("#{OPENBLAS_DIR}/tmp/openblas.log", 'w') { |f| f.puts(mkstdout) }
45
+ unless mkstatus.success?
46
+ puts 'Failed to build OpenBLAS.'
47
+ puts 'Check the make-openblas.log file for more details:'
48
+ puts "#{OPENBLAS_DIR}/tmp/openblas.log"
49
+ exit(1)
50
+ end
51
+
52
+ puts 'Installing OpenBLAS.'
53
+ insstdout, _insstderr, insstatus = Open3.capture3("make install PREFIX=#{OPENBLAS_DIR}")
54
+ File.open("#{OPENBLAS_DIR}/tmp/openblas.log", 'a') { |f| f.puts(insstdout) }
55
+ unless insstatus.success?
56
+ puts 'Failed to install OpenBLAS.'
57
+ puts 'Check the make-openblas.log file for more details:'
58
+ puts "#{OPENBLAS_DIR}/tmp/openblas.log"
59
+ exit(1)
60
+ end
61
+
62
+ FileUtils.touch("#{OPENBLAS_DIR}/installed_#{OPENBLAS_VER}")
63
+ end
64
+ end
65
+
66
+ unless find_library('openblas', nil, "#{OPENBLAS_DIR}/lib")
67
+ puts 'libopenblas is not found.'
68
+ exit(1)
69
+ end
70
+
71
+ unless find_header('openblas_config.h', nil, "#{OPENBLAS_DIR}/include")
72
+ puts 'openblas_config.h is not found.'
73
+ exit(1)
74
+ end
75
+
76
+ create_makefile('numo/openblas/openblas')
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Numo::OpenBLAS downloads and builds OpenBLAS during installation and
3
+ * uses that as a background library for Numo::Linalg.
4
+ */
5
+
6
+ #include <ruby.h>
7
+ #include <openblas_config.h>
8
+
9
+ VALUE mNumo;
10
+ VALUE mOpenBLAS;
11
+
12
+ void Init_openblas()
13
+ {
14
+ /**
15
+ * Document-module: Numo
16
+ * Numo is the top level namespace of NUmerical MOdules for Ruby.
17
+ */
18
+ mNumo = rb_define_module("Numo");
19
+
20
+ /**
21
+ * Document-module: Numo::Liblinear
22
+ * Numo::OpenBLAS loads Numo::NArray and Linalg with OpenBLAS used as backend library.
23
+ */
24
+ mOpenBLAS = rb_define_module_under(mNumo, "OpenBLAS");
25
+
26
+ /* The number of cores detected by OpenBLAS. */
27
+ rb_define_const(mOpenBLAS, "OPENBLAS_NUM_CORES", INT2NUM(OPENBLAS_NUM_CORES));
28
+
29
+ /* The core name detected by OpenBLAS. */
30
+ rb_define_const(mOpenBLAS, "OPENBLAS_CHAR_CORENAME", rb_str_new_cstr(OPENBLAS_CHAR_CORENAME));
31
+
32
+ /* The version of OpenBLAS used in background library. */
33
+ rb_define_const(mOpenBLAS, "OPENBLAS_VERSION", rb_str_new_cstr(OPENBLAS_VERSION));
34
+ }
@@ -3,6 +3,7 @@
3
3
  require 'numo/narray'
4
4
  require 'numo/linalg/linalg'
5
5
  require 'numo/openblas/version'
6
+ require 'numo/openblas/openblas'
6
7
 
7
8
  module Numo
8
9
  module Linalg
@@ -1,12 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Numo is the top level namespace of NUmerical MOdules for Ruby.
3
4
  module Numo
4
5
  # Numo::OpenBLAS loads Numo::NArray and Linalg with OpenBLAS used as backend library.
5
6
  module OpenBLAS
6
7
  # The version of Numo::OpenBLAS you install.
7
- VERSION = '0.1.1'
8
-
9
- # The version OpenBLAS that Numo::OpenBLAS build and use.
10
- OPENBLAS_VERSION = '0.3.10'
8
+ VERSION = '0.2.0'
11
9
  end
12
10
  end
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.bindir = 'exe'
31
31
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
32
  spec.require_paths = ['lib']
33
+ spec.extensions = ['ext/numo/openblas/extconf.rb']
33
34
 
34
35
  spec.add_runtime_dependency 'numo-linalg', '>= 0.1.4'
35
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: numo-openblas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - yoshoku
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-26 00:00:00.000000000 Z
11
+ date: 2020-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: numo-linalg
@@ -30,7 +30,8 @@ description: |
30
30
  email:
31
31
  - yoshoku@outlook.com
32
32
  executables: []
33
- extensions: []
33
+ extensions:
34
+ - ext/numo/openblas/extconf.rb
34
35
  extra_rdoc_files: []
35
36
  files:
36
37
  - ".gitignore"
@@ -42,9 +43,10 @@ files:
42
43
  - LICENSE.txt
43
44
  - README.md
44
45
  - Rakefile
46
+ - ext/numo/openblas/extconf.rb
47
+ - ext/numo/openblas/openblas.c
45
48
  - lib/numo/openblas.rb
46
49
  - lib/numo/openblas/version.rb
47
- - lib/rubygems_plugin.rb
48
50
  - numo-openblas.gemspec
49
51
  - vendor/tmp/.gitkeep
50
52
  homepage: https://github.com/yoshoku/numo-openblas
@@ -1,65 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- require 'rubygems'
4
- require 'rubygems/package'
5
-
6
- require 'digest/sha1'
7
- require 'etc'
8
- require 'fileutils'
9
- require 'open-uri'
10
- require 'open3'
11
-
12
- Gem.post_install do
13
- openblas_ver = '0.3.10'
14
- openblas_key = 'cbe3fdd0e6ee235debc611d76976dac62f3ddc1c'
15
- openblas_uri = "https://github.com/xianyi/OpenBLAS/archive/v#{openblas_ver}.tar.gz"
16
- openblas_dir = File.expand_path(__dir__ + '/../vendor')
17
-
18
- next true if File.exist?("#{openblas_dir}/installed_#{openblas_ver}")
19
-
20
- puts "Downloading OpenBLAS #{openblas_ver}."
21
- URI.open(openblas_uri) do |rf|
22
- File.open("#{openblas_dir}/tmp/openblas.tgz", 'wb') { |sf| sf.write(rf.read) }
23
- end
24
-
25
- next false if openblas_key != Digest::SHA1.file("#{openblas_dir}/tmp/openblas.tgz").to_s
26
-
27
- puts 'Unpacking OpenBLAS tar.gz file.'
28
- Gem::Package::TarReader.new(Zlib::GzipReader.open("#{openblas_dir}/tmp/openblas.tgz")) do |tar|
29
- tar.each do |entry|
30
- next unless entry.file?
31
-
32
- filename = "#{openblas_dir}/tmp/#{entry.full_name}"
33
- next if filename == File.dirname(filename)
34
-
35
- FileUtils.mkdir_p("#{openblas_dir}/tmp/#{File.dirname(entry.full_name)}")
36
- File.open(filename, 'wb') { |f| f.write(entry.read) }
37
- File.chmod(entry.header.mode, filename)
38
- end
39
- end
40
-
41
- Dir.chdir("#{openblas_dir}/tmp/OpenBLAS-#{openblas_ver}") do
42
- puts 'Building OpenBLAS. This could take a while...'
43
- mkstdout, _mkstderr, mkstatus = Open3.capture3("make -j#{Etc.nprocessors}")
44
- File.open("#{openblas_dir}/tmp/openblas.log", 'w') { |f| f.puts(mkstdout) }
45
- unless mkstatus.success?
46
- puts 'Failed to build OpenBLAS.'
47
- puts 'Check the make-openblas.log file for more details:'
48
- puts "#{openblas_dir}/tmp/openblas.log"
49
- break false
50
- end
51
-
52
- puts 'Installing OpenBLAS.'
53
- insstdout, _insstderr, insstatus = Open3.capture3("make install PREFIX=#{openblas_dir}")
54
- File.open("#{openblas_dir}/tmp/openblas.log", 'a') { |f| f.puts(insstdout) }
55
- unless insstatus.success?
56
- puts 'Failed to install OpenBLAS.'
57
- puts 'Check the make-openblas.log file for more details:'
58
- puts "#{openblas_dir}/tmp/openblas.log"
59
- break false
60
- end
61
-
62
- FileUtils.touch("#{openblas_dir}/installed_#{openblas_ver}")
63
- true
64
- end
65
- end