link もっと前
   2019年 7月 12日 -
      2019年 7月 3日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

OpenVX on OpenCL

会社の人に OpenVX の別実装があることを教えてもらったので、試してみました。

以前、ソフトウェア実装の OpenVX ライブラリを動かしました(2018年 11月 14日の日記参照)が、AMD の OpenVX の実装(GitHub へのリンク)を使うと、GPU で OpenVX を動かすことができます。

AMD の OpenVX 実装ではありますが、OpenCL を使うので GPU は Radeon である必要はなく、Intel の GPU でも OK です。これが共通 API たる OpenCL の良いところですね。私は現状 Radeon を持っていませんので、Intel の内蔵 GPU で動かしてみようと思います。

動かし方

まず OpenVX ライブラリをビルドします。Debian であれば opencl-c-headers 辺りが必要になるはずです。また GPU ドライバとして Intel GPU ドライバの OSS 実装である beignet を使います。Debian であれば beignet-dev, beignet-opencl-icd 辺りのパッケージでインストールできます。

AMD OpenVX ライブラリのビルド
$ git clone https://github.com/GPUOpen-ProfessionalCompute-Libraries/amdovx-core
$ cd amdovx-core

$ mkdir build
$ cd build
$ cmake ../
$ make -j4

テストには前回も活躍した OpenVX アプリを使用します。OpenCV のバージョンは 3.2 です。もし古いバージョンの OpenCV を使っている場合は -lopencv_videoio オプションを外してください(おそらく「そのようなライブラリは存在しない」とエラーが出る)。

OpenVX サンプルアプリケーションのビルド
g++ solution_exercise1.cpp -Wall -I../include \
  -lopencv_video -lopencv_videoio -lopencv_highgui -lopencv_imgproc -lopencv_core \
  -lopenvx -L/path/to/amdovx-core/build/lib

前回とほぼ同じですので、さほど難しくないと思います。

GPU の実力

ビルドできましたので、実行……をする前に、vxProcessGraph の前後に時間計測のコードを入れておきます。

時間計測のパッチ

diff --git a/tutorial_exercises/solution_exercise1/solution_exercise1.cpp b/tutorial_exercises/solution_exercise1/solution_exercise1.cpp
index c7b8e21..ebc07e5 100644
--- a/tutorial_exercises/solution_exercise1/solution_exercise1.cpp
+++ b/tutorial_exercises/solution_exercise1/solution_exercise1.cpp
@@ -30,6 +30,8 @@
  *          Kari Pulli             <kari.pulli@gmail.com>
  */
 
+#include <sys/time.h>
+
 ////////
 // Include OpenCV wrapper for image capture and display.
 #include "opencv_camera_display.h"
@@ -368,6 +370,8 @@ int main( int argc, char * argv[] )
     // Process the video sequence frame by frame until the end of sequence or aborted.
     for( int frame_index = 0; !gui.AbortRequested(); frame_index++ )
     {
+        struct timeval st, ed, el;
+
         ////////********
         // Copy the input RGB frame from OpenCV to OpenVX.
         // Use vxAccessImagePatch and vxCommitImagePatch APIs (see "VX/vx_api.h").
@@ -407,8 +411,11 @@ int main( int argc, char * argv[] )
         //      if the frame_index == 0 (i.e., the first frame of the video
         //      sequence), otherwise, select the feature tracking graph.
         //   2. Use ERROR_CHECK_STATUS for error checking.
+        gettimeofday(&st, NULL);
         ERROR_CHECK_STATUS( vxProcessGraph( frame_index == 0 ? graphHarris : graphTrack ) );
-
+        gettimeofday(&ed, NULL);
+        timersub(&ed, &st, &el);
+        printf("ProcessGraph:%d.%06d[s]\n", (int)el.tv_sec, (int)el.tv_usec);
 
         ////////********
         // To mark the keypoints in display, you need to access the output

実行環境は下記のとおりです。

  • CPU: Pentium J4205/1.50GHz
  • Mem: DDR3L-1600 8GB x 2
  • GPU: Intel HD Graphics 505/250MHz(J4205 内蔵)

最初にソフトウェア版のライブラリを実行します。

OpenVX サンプルアプリケーション(ソフトウェア版 OpenVX)
$ LD_LIBRARY_PATH=/path/to/openvx1.1/out/LINUX/x86_64/release/ ./a.out

OK: FILE ../../tutorial_videos/PETS09-S1-L1-View001.avi 768x480
LOG: [ status = -1 ] Hello there!

ProcessGraph:0.254740[s]
ProcessGraph:0.183655[s]
ProcessGraph:0.181082[s]
ProcessGraph:0.180022[s]
ProcessGraph:0.182914[s]
ProcessGraph:0.180622[s]
...

最初のフレームは HarrisCorner による角検出、それ以降のフレームはトラッキングに要した時間です(そういう内容のデモです)。トラッキングに大体 180ms 程度、掛かっている様子がわかります。

次に内蔵 GPU で実行します。

OpenVX サンプルアプリケーション(GPU 版 OpenVX)
$ DISPLAY=:1 LD_LIBRARY_PATH=/path/to/amdovx-core/build/lib ./a.out

OK: FILE ../../tutorial_videos/PETS09-S1-L1-View001.avi 768x480
LOG: [ status = -1 ] Hello there!

LOG: [ status = 0 ] OK: OpenVX using GPU device#0 (Intel(R) HD Graphics Broxton 0) [OpenCL 2.0 beignet 1.3] [SvmCaps 0 0]

ProcessGraph:0.030192[s]
ProcessGraph:0.016439[s]
ProcessGraph:0.015872[s]
ProcessGraph:0.015629[s]
ProcessGraph:0.015629[s]
ProcessGraph:0.015679[s]
...

トラッキングに 16ms 程度しか掛かりません。正直言って GPU としてはローエンドの下の方ですが、J4205 の CPU 処理と比較すると圧倒的に速いです。GPU 恐るべしですね。

[編集者: すずき]
[更新: 2019年 7月 16日 02:26]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

ARM と RISC-V で CoreMark 対決

先日購入した HiFive Unleashed が異様に遅く感じるので、手持ちの 64bit コア同士でベンチマーク対決をしてみました。以前、モナコインのマイナーでベンチマークしたとき(2019年 5月 27日参照)は、Cortex-A53 の 1/4 くらいの性能でした。

  • Rockchip RK3399(Cortex-A72 / 1.8GHz x 2, Cortex-A53 / 1.4GHz x 4)
  • Rockchip RK3328(Cortex-A53 / 1.3GHz x 4)
  • SiFive FU540(Rocket / 1GHz x 4)

ベンチマークは CoreMark を使いました。コンパイル条件は下記の通りです。

  • RK3399, RK3328: GCC-6.3.0 Ofast
  • FU540: GCC-8.3.0 Ofast

RK3399, RK3328 は Debian arm64 Stable を使っています。Stable は RISC-V に対応していませんので、FU540 だけは Debian riscv64 Unstable を使っています。

測定の結果は、

  • RK3399: Iterations/Sec : 10242.753252
  • RK3328: Iterations/Sec : 4427.390791
  • FU540: Iterations/Sec : 2255.130422

RK3328 と FU540 は 2倍の差です。動作周波数の差は 1.3倍ですから、インオーダーのコア同士にしては性能差があります。

RK3399 は異様に速いです。もしかすると A72 側で動いているかもしれません。CoreMark は特定の CPU に張り付ける方法が良くわからないですね……。

メモ: 技術系の話は Facebook から転記しておくことにした。多少追記。

[編集者: すずき]
[更新: 2019年 7月 6日 00:41]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

Unleashed の動作周波数

SiFive FU540 のコア動作周波数は簡単に見ることはできなかったので、求め方をメモしておきます。

アドレス 0x10000000 に PRCI(Power Reset Clocking Interrupt)のレジスタがありますので、実機でその辺をダンプします。

突然ダンプしますって言われても、どうしたら良いんですか?という方は拙作の memaccess(GitHub へのリンク)をお使いください。使い慣れたツールがあれば、RISC-V 上でビルドすれば使えます(Unleashed は Linux が動くので)。

私の持っている HiFive Unleashed では下記のようになっていました。

PRCI レジスタ領域のダンプ
10000000 c0000000 82110ec0 00000000 82110dc0
10000010 80000000 00000000 00000000 82128ec0
10000020 80000000 00000000 0000002f 00000004

COREPLL 周波数を司るレジスタは、corepllcfg0(offset: 0x04)です。値は 0x82110ec0 ですね。

  • [ 5: 0] divr = 0x0
  • [14: 6] divf = 0x3b = 59
  • [17:15] divq = 0x2
  • [20:18] range = 3'b100 => 33MHz

レジスタの各フィールドはこんな意味になっています。計算式は、

COREPLL 周波数の計算式
COREPLL = 33.33MHz / (divr + 1) * 2 * (divf + 1) / 2 ^ divq

ですので、上記の値を当てはめますと、

COREPLL 周波数
COREPLL
= 33.33MHz / (0 + 1) * 2 * (59 + 1) / 2 ^ 2
= 33.33 * 120 / 4 = 999.99MHz ≒ 1GHz

すなわち 1GHz 駆動であることがわかります。

ウソは書いていないつもりですが、情報源が気になる方は FU540 の仕様書 "Chapter.7 Cloking and Reset" の章を見てください。

FU540 の仕様書は SiFive のサイト(FU540 のサイトへのリンク)から、誰でもゲットできます。ページの下側かつ左側にある "FU540-C000 Manual" と書いてあるリンクです。

ARM の場合は簡単

Unleashed は面倒でしたが、Rockchip 系(に限らないと思いますが)の SoC は /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq を見ると簡単に最大動作周波数を取得できます。

RK3328 の各コアの最大動作周波数
$ for i in /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq ; do echo $i; cat $i; done
/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
1296000
/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_max_freq
1296000
/sys/devices/system/cpu/cpu2/cpufreq/cpuinfo_max_freq
1296000
/sys/devices/system/cpu/cpu3/cpufreq/cpuinfo_max_freq
1296000
RK3399 の各コアの最大動作周波数
$ for i in /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq ; do echo $i; cat $i; done
/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
1416000
/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_max_freq
1416000
/sys/devices/system/cpu/cpu2/cpufreq/cpuinfo_max_freq
1416000
/sys/devices/system/cpu/cpu3/cpufreq/cpuinfo_max_freq
1416000
/sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_max_freq
1800000
/sys/devices/system/cpu/cpu5/cpufreq/cpuinfo_max_freq
1800000

簡単で良いですね。こういう細かい使い勝手は RISC-V はこれからでしょうか。とはいえ世界は RISC-V 旋風が吹き荒れているそうなので、次第に充実していくことでしょう。

メモ: 技術系の話は Facebook から転記しておくことにした。大幅に追記。

[編集者: すずき]
[更新: 2019年 7月 6日 01:16]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2019年 7月 12日 -
      2019年 7月 3日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 7/16 02:26

カレンダー

<2019>
<<<07>>>
-123456
78910111213
14151617181920
21222324252627
28293031---

最近のコメント 20件

  • link 19年05月17日
    すずき 「試してみたら、同じみたいです。\nわざわ...」
    (更新:05/25 10:35)
  • link 19年05月17日
    hdk 「実際に試したわけではないので素朴な疑問な...」
    (更新:05/23 21:07)
  • link 19年04月01日
    すずき 「どの CPU というかシステムでも同じ傾...」
    (更新:04/05 11:03)
  • link 19年04月01日
    hdk 「去年Ryzen 7 1700で測りました...」
    (更新:04/02 22:48)
  • link 19年03月05日
    すずき 「> オシロの波形見てて気がつかなか...」
    (更新:03/21 17:45)
  • link 19年03月05日
    kml 「> 自分が持っている RockPr...」
    (更新:03/20 21:30)
  • link 19年03月10日
    すずき 「ありがとー!!」
    (更新:03/13 09:46)
  • link 19年03月10日
    hdk 「誕生日おめでとー!」
    (更新:03/13 01:14)
  • link 18年12月11日
    すずき 「確認いただいてありがとうございます。直っ...」
    (更新:12/27 00:22)
  • link 18年12月11日
    T4 「再現しませんね\n\n確かに、過去にそう...」
    (更新:12/25 12:45)
  • link 18年12月11日
    すずき 「失礼しました。Rock64 の方は、\n...」
    (更新:12/22 02:10)
  • link 18年12月11日
    T4 「私は、Tinker Board を持って...」
    (更新:12/21 10:14)
  • link 18年12月11日
    すずき 「> 但し、これもう一年以上前の話で...」
    (更新:12/19 11:54)
  • link 18年12月11日
    T4 「> Rockchip の U-bo...」
    (更新:12/18 13:31)
  • link 18年11月28日
    すずき 「Linux に contribute す...」
    (更新:12/10 12:33)
  • link 18年11月28日
    T4 「やっぱり貴方でしたか、ご苦労さまでした。...」
    (更新:12/05 09:20)
  • link 18年11月28日
    すずき 「RK3228 じゃなくて RK3288 ...」
    (更新:12/05 02:19)
  • link 18年11月28日
    すずき 「ありがとうございます。Linux のコミ...」
    (更新:12/05 02:04)
  • link 18年12月01日
    すずき 「私も最初、HDD, SSD は使いまわそ...」
    (更新:12/04 12:49)
  • link 18年11月28日
    T4 「まずは、おめでとうございます。\n\nい...」
    (更新:12/04 10:00)

最近の記事 3件

link もっとみる
  • link 19年07月12日
    すずき 「[OpenVX on OpenCL] 会社の人に OpenVX の...」
    (更新:07/16 02:26)
  • link 19年07月04日
    すずき 「[Unleashed の動作周波数] SiFive FU540 の...」
    (更新:07/06 01:16)
  • link 19年05月27日
    すずき 「[がんばれ HiFive Unleashed] HiFive Un...」
    (更新:07/06 00:47)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報