numo-openblas 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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