3. GPU による高速化

3.1. CUDA Package コマンド

Mapleでは、GPU デバイスのオン・オフ、情報参照するための CUDA Package コマンドを用意しています。次の 3 つのコマンドがあります。

Enable: GPU デバイス使用のオン・オフを行う
IsEnabled GPU デバイス使用状況を表示
Properties GPU デバイスの情報を表示

デフォルトでは、GPU デバイスの使用はオフになっています そのため、GPU デバイスを使用できるようにするには、CUDA:-Enable(true); を実行する必要があります。

まず、cudaモジュールを読み込み、Mapleを起動します。

$ module load cuda
$ maple

CUDA:-IsEnabled(); により、GPU デバイス認識状況を確認します。デフォルトでは、オフになっています。

> CUDA:-IsEnabled();   
                                                               false

CUDA:-Enable(true); により、GPU デバイスを使用できるようにします。

> CUDA:-Enable(true);
                                                               false

CUDA:-IsEnabled(); の結果が true となり、GPU デバイスが使用できる状態になりました。

> CUDA:-IsEnabled(); 
                                                               true

CUDA:-Enable(false); により、GPU デバイスを使用しない状態に戻すこともできます。

> CUDA:-Enable(false);
                                                               true

CUDA:-IsEnabled(); の結果が false となりました。

> CUDA:-IsEnabled();
                                                               false

GPU デバイスの情報を得るには、CUDA:-Properties(); を実行します。

> CUDA:-Properties();
[table([%12, "ID" = 0, "Warp Size" = 32, %11, %10, %9, %8, %7, %6, "Major" = 6, %5, %4, %3, %2, "Minor" = 0,
    "Clock Rate" = 1480500, "Device Overlap" = 1,
    %1
    ]), table([%12, "ID" = 1, "Warp Size" = 32, %11, %10, %9, %8, %7, %6, "Major" = 6, %5, %4, %3, %2, "Minor" = 0,
    "Clock Rate" = 1480500, "Device Overlap" = 1,
    %1
    ]), table([%12, "ID" = 2, "Warp Size" = 32, %11, %10, %9, %8, %7, %6, "Major" = 6, %5, %4, %3, %2, "Minor" = 0,
    "Clock Rate" = 1480500, "Device Overlap" = 1,
    %1
    ]), table([%12, "ID" = 3, "Warp Size" = 32, %11, %10, %9, %8, %7, %6, "Major" = 6, %5, %4, %3, %2, "Minor" = 0,
    "Clock Rate" = 1480500, "Device Overlap" = 1,
    %1
    ])]
%1 := "Total Constant Memory" = 65536
%2 := "Texture Alignment" = 512
%3 := "Total Global Memory" = 4294967295
%4 := "Max Grid Size" = [2147483647, 65535, 65535]
%5 := "Resisters Per Block" = 65536
%6 := "MultiProcessor Count" = 56
%7 := "Name" = "Tesla P100-SXM2-16GB"
%8 := "Shared Memory Per Block" = 49152
%9 := "Memory Pitch" = 2147483647
%10 := "Kernel Exec Timeout Enabled" = false
%11 := "Max Threads Per Block" = 1024
%12 := "Max Threads Dimensions" = [1024, 1024, 64]

デバイスを指定しての実行も可能です。GPU が4つあるので id=0, id=1, id=2, id=3の4通りの指定が可能です。

> CUDA:-Properties(id=0);
table(["Max Threads Dimensions" = [1024, 1024, 64], "ID" = 0, "Warp Size" = 32, "Max Threads Per Block" = 1024,
    "Kernel Exec Timeout Enabled" = false, "Memory Pitch" = 2147483647, "Shared Memory Per Block" = 49152,
    "Name" = "Tesla P100-SXM2-16GB", "MultiProcessor Count" = 56, "Major" = 6, "Resisters Per Block" = 65536,
    "Max Grid Size" = [2147483647, 65535, 65535], "Total Global Memory" = 4294967295, "Texture Alignment" = 512, "Mi
    "Clock Rate" = 1480500, "Device Overlap" = 1,
    "Total Constant Memory" = 65536
    ])

3.2. GPU 対応している機能

LinearAlgebraの行列積演算をGPUにより加速することができます。

サイバネットシステム株式会社のMaple紹介ページ「効率性の向上 - CUDA 加速 (6.1), (6.2)」にある サンプルを用いてTSUBAME2上で計算した例を以下に示します。

http://www.cybernet.co.jp/maple/product/maple/maple14/

あらかじめ、下記のファイルを作成しておきます。

test.m

`N := 20:

m1 := LinearAlgebra:-RandomMatrix ( 2000, 2000, outputoptions = [ datatype = float [ 4 ] ] ):
m2 := LinearAlgebra:-RandomMatrix ( 2000, 2000, outputoptions = [ datatype = float [ 4 ] ] ):

t := time[ real ] ():
to N do mNoCuda := m1 . m2: end:
tNoCuda := time[ real ] () - t;

CUDA:-Enable( true );
t := time[ real ] ():
to N do mCuda := m1 . m2: end:
tCuda := time[ real ] () - t;

ジョブ投入するためのスクリプトを作成します。
maple.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash
#$ -cwd
#$ -l f_node=1
#$ -l h_rt=0:10:00
#$ -V

. /etc/profile.d/modules.sh
module load cuda openmpi maple

maple < test.m

qsubコマンドによりバッチ実行します。

$ qsub maple.sh

計算終了後、「maple.sh. o[ジョブID]」ファイルができているので、確認します。
ファイル上部のNo licenses available, queueing request...はライセンスが不足していることを示します。
ライセンス数が1本となっておりますので、ライセンスの使用状況を確認し、ジョブを一旦停止して再実行してください。ライセンスが不足していても計算資源は確保されたままとなりますので、ご注意ください。

$ cat maple.sh. o[ジョブID]
No licenses available, queueing request...
    |\^/|     Maple 2019 (X86 64 LINUX)
._|\|   |/|_. Copyright (c) Maplesoft, a division of Waterloo Maple Inc. 2019
 \  MAPLE  /  All rights reserved. Maple is a trademark of
 <____ ____>  Waterloo Maple Inc.
      |       Type ? for help.
> N := 20:

> m1 := LinearAlgebra:-RandomMatrix ( 2000, 2000, outputoptions = [ datatype = float [ 4 ] ] ):
> m2 := LinearAlgebra:-RandomMatrix ( 2000, 2000, outputoptions = [ datatype = float [ 4 ] ] ):
>
> t := time[ real ] ():
> to N do mNoCuda := m1 . m2: end:
memory used=77.1MB, alloc=84.6MB, time=4.05
memory used=168.7MB, alloc=99.9MB, time=7.99
> tNoCuda := time[ real ] () - t;
                                tNoCuda := 2.528
>
> CUDA:-Enable( true );
                                     false
> t := time[ real ] ():
> to N do mCuda := m1 . m2: end:
memory used=397.9MB, alloc=115.2MB, time=20.59
> tCuda := time[ real ] () - t;
                                 tCuda := 0.578
> quit
memory used=642.5MB, alloc=359.3MB, time=22.97

3.3. リファレンス

詳細については、Mapleのオンラインヘルプを参照してください。

http://www.maplesoft.com/support/help/Maple/view.aspx?path=CUDA