行列積プログラム:CPUでの場合
出典: トータル・ディスクロージャ・サイト(事実をありのままに)
CPUとGPGPUの速度を比較するため、WVさんに簡単な例を作ってもらいました。行列と行列の積を求めるプログラムです。実用的なプログラムでもよく使われます。BLASを使えばいいじゃないかという突っ込みには、あくまでも例題という事で。言語はFortranを使います。HPC用途のプログラムはFortranで書かれている事が多いのと、FortranでGPGPUという記事も少ないので。
これからいくつかに分けてプログラムを紹介していきます。最初は、CPUで実行する例です。コンパイラはPGIのFortranコンパイラを使います。GPGPUでも同じFortranコンパイラを使うので、敢えてIntelコンパイラは使いません。CPUでもGPGPUでも同じコンパイラでプログラミングできる利便性に焦点を当てます。
速度を比較するのは、CPUでの例、全く同じプログラムにディレクティブを入れるだけでGPGPUで実行する例、CUDAぽいFortranプログラムの例、Shared Memoryを使って最高速にしたFortranプログラムの例です。今日は時間がないので、最初のCPUでのプログラムをアップするだけにとどめます。
このプログラムの実行時間は約45秒でした。続きは来週に。
$ pgf95 -V
pgf95 10.2-0 64-bit target on x86-64 Linux -tp nehalem-64
Copyright 1989-2000, The Portland Group, Inc. All Rights Reserved.
Copyright 2000-2010, STMicroelectronics, Inc. All Rights Reserved.
$ cat matmul.f95
PROGRAM MATMUL
INTEGER, PARAMETER :: N = 4000
REAL :: A(N, N), B(N, N)
REAL*8 :: SUM
DO J = 1, N
DO I = 1, N
A(I, J) = REAL(I * N + J) / REAL(N * N)
END DO
END DO
CALL CPU_TIME(T1)
DO J = 1, N
DO I = 1, N
B(I, J) = 0.0
DO K = 1, N
B(I, J) = B(I, J) + A(I, K) * A(K, J)
END DO
END DO
END DO
CALL CPU_TIME(T2)
WRITE(*, *) T2 - T1, 'SEC'
SUM = 0.0
DO J = 1, N
DO I = 1, N
SUM = SUM + B(I, J)
END DO
END DO
WRITE(*, *) 'CHECKSUM =', SUM
END PROGRAM MATMUL
$ pgf95 -fastsse matmul.f95 -o matmul
$ ./matmul
44.69213 SEC
CHECKSUM = 16017339241.10097
$
--ケンちゃん 2010年3月5日 (金) 16:43 (JST)
この記事へのコメントをお寄せください
- サイトへの書き込みに差し支えございましたら トータルディスクロージャーサイトサポート係へメールをお送りください 。
- トータル・ディスクロージャ・サイトに投稿された文章と画像は、すべてその著作権がHPCシステムズ株式会社に帰属し、HPCシステムズ株式会社が著作権を所有することに同意してください。
- あなたの文章が他人によって自由に編集、配布されることを望まない場合は、投稿を控えてください。
- コメントを書き込む場合は名前にひらがなを織り交ぜてください。
- あなたの投稿する文章と画像はあなた自身によって書かれたものであるか、パブリック・ドメインかそれに類する自由なリソースからの複製であることを約束してください。あなたが著作権を保持していない作品を許諾なしに投稿してはいけません!
