4. CUDALink の使用方法

バージョン11.2.0ではCUDALink を用いることで,Mathematicaから GPU を利用できるようになります。
バージョン11.1.1はTSUBAME3で導入されているP100 については現在のところ未サポートとなっておりますので、GPUを利用される際はバージョンにご注意下さい。
バージョン12.0.0では現在の計算ノードのCUDAドライババージョン(10.0)では未サポートとなっております。
CUDALinkがサポートされているかどうかの簡単な確認方法は以下です。

$ ls -d /apps/t3/sles12sp2/isv/Mathematica/*/CUDALink
/apps/t3/sles12sp2/isv/Mathematica/11.2/CUDALink
/apps/t3/sles12sp2/isv/Mathematica/11.3/CUDALink

CUDALink を用いることで、Mathematicaにて GPU を利用できるようになります。
CUDALinkについての詳細な内容は、Mathematicaドキュメントセンターの以下のページをご参照ください。
CUDALink ユーザガイド
CUDALink
GPU計算

4.2. 利用環境の設定

CUDALink を利用するためには、利用環境の設定が必要です。
初回設定時は4.2.1節から4.2.3節を順に実行します。
2回目以降は以下のコマンドで環境が設定されます。
CUDAQ[]後の返り値がTrueであれば正常に読み込まれております。
読み込まれていない場合は初期設定を再度実施して下さい。

In[1]:= Needs["CUDALink`"]                                                                                          
In[2]:= CUDAQ[] 
Out[2]= True

4.2.1. UserBaseDirectoryの確認

下記のディレクトリ「/home/0/GSICUSER/.Mathematica/Paclets/Repository」は例です。
実際には自分のアカウントのホームディレクトリ以下が指定されています。

GSICUSER@r0i0n0:~> module load mathematica/11.2.0
GSICUSER@r0i0n0:~> math
Mathematica 11.2.0 Kernel for Linux x86 (64-bit)
Copyright 1988-2017 Wolfram Research, Inc.

In[1]:= FileNameJoin[{$UserBaseDirectory, "Paclets", "Repository"}]

Out[1]= /home/0/GSICUSER/.Mathematica/Paclets/Repository   <--- ディレクトリを確認

In[2]:=Quit

4.2.2. Pacletファイルの解凍と再構築

以下の操作はshell上で実施します。

GSICUSER@r0i0n0:~> cd /home/0/GSICUSER/.Mathematica/Paclets/Repository/
GSICUSER@r0i0n0:~/.Mathematica/Paclets/Repository>unzip /apps/t3/sles12sp2/isv/Mathematica/11.2/CUDALink/CUDAResources-Lin64-11.2.63.zip
GSICUSER@r0i0n0:~/.Mathematica/Paclets/Repository> math

Mathematica 11.2.0 Kernel for Linux x86 (64-bit)
Copyright 1988-2017 Wolfram Research, Inc.

In[1]:= RebuildPacletData[]

In[2]:=Quit

4.2.3. CUDALinkの読み込みと動作確認

GSICUSER@r0i0n0:~/.Mathematica/Paclets/Repository> math
Mathematica 11.2.0 Kernel for Linux x86 (64-bit)
Copyright 1988-2017 Wolfram Research, Inc.

In[1]:= Needs["CUDALink`"]                                                                                           
In[2]:= CUDAQ[]                                                                                                     

Out[2]= True

In[3]:= CUDADot[Table[i, {i, 10}, {j, 10}],Table[i, {i, 10}, {j, 10}]]                                                             
Out[3]= {{55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, {110, 110, 110, 110, 110, 110, 110, 110, 110, 110},

>    {165, 165, 165, 165, 165, 165, 165, 165, 165, 165}, {220, 220, 220, 220, 220, 220, 220, 220, 220, 220},

>    {275, 275, 275, 275, 275, 275, 275, 275, 275, 275}, {330, 330, 330, 330, 330, 330, 330, 330, 330, 330},

>    {385, 385, 385, 385, 385, 385, 385, 385, 385, 385}, {440, 440, 440, 440, 440, 440, 440, 440, 440, 440},

>    {495, 495, 495, 495, 495, 495, 495, 495, 495, 495}, {550, 550, 550, 550, 550, 550, 550, 550, 550, 550}}

In[4]:= lst = RandomReal[1., {10}];                                                                                                
In[5]:= CUDAFourier[lst]                                                                                                            
Out[5]= {2.00511 + 0. I, 0.170165 + 0.153382 I, 0.313523 + 0.0756414 I, -0.0606903 + 0.209749 I, 0.178923 - 0.522008 I,

>    -0.200097 + 0. I, 0.178923 + 0.522008 I, -0.0606903 - 0.209749 I, 0.313523 - 0.0756414 I, 0.170165 - 0.153382 I}

In[6]:= Fourier[lst]                                                                                                               
Out[6]= {2.00511 + 0. I, 0.170165 + 0.153382 I, 0.313523 + 0.0756414 I, -0.0606903 + 0.209749 I, 0.178923 - 0.522008 I,

>    -0.200097 + 0. I, 0.178923 + 0.522008 I, -0.0606903 - 0.209749 I, 0.313523 - 0.0756414 I, 0.170165 - 0.153382 I}