Blenderのverが2.81になった。この機会にGPU+CPUレンダーとタイルサイズの最適解を探ってみる。
先日、安かったから組んだRyzen7 2700のマシン、そのテストも兼ねて。
テスト環境
- Blender 2.81 日本語
- v2.74公式スプラッシュ fishy cat(CC0)
- CYCLESレンダー
- OS Windows10
- CPU Ryzen7 2700(OC 3625Mhz)
- GPU MSI Radeon RX 570 ARMOR 8G OC
fishy catは、もふもふの処理がクッソ重い。が、もうそれは過去のものらしい。Ryzen7導入により余裕すぎるレンダリング速度に到達。
ただし、レンダー後のコンポジットノードの関連処理は未だにクッソ重いため、「出力プロパティ→ポストプロセッシング」のコンポジティングとシーケンサーをオフにして測定したものを基本とした(2.74との互換性の問題がありそう)。寸法はデフォの200%。
この状態から以下3か所の設定を変更して差を測定した。
- 「レンダープロパティ→パフォーマンス→タイル」の数値
- 「レンダープロパティ→レンダーエンジン」のデバイス
- 「編集→プリファレンス→システム→Cyclesレンダーデバイス」のオンオフボタン
この環境の場合、初回レンダリング時のカーネルロード時間が割と長い(Radeonのドライバverのせいかも)ため、数回レンダリングしたのち、最も早いタイムを採用した。
GPU+CPUレンダーの効果
いつの間にか、GPUとCPUを同時に使いレンダリングできる機能(Hybrid renderingやCombined renderingなどと呼ばれている)が実装されていた。
効果を以下タイルサイズのパターンで検証。
- CPUのみ 32
- GPUのみ 1024
- CPU+GPU 32+α
※GPUとCPUの最適なタイルサイズは反比例する傾向にある。GPUは大きいほど速く、多コアのCPUは小さいほど速い。のだが、ドライバとblenderのチューニング次第(おそらくRTX20シリーズあたりに最適化されてる)で大きく変わる模様。2.7系と2.8系でも結果が変わる。
CPUのみ タイル32×32
21.65秒を記録。
単純に計算して、以前の3倍くらい速くなっている(以前書いた記事)※。さすが16スレッド20MBキャッシュだ。数の暴力は強烈。
※前述のとおり2.8系の方が速い。旧環境(i7 3770)では2.79が50秒台、2.8系だと40秒台程度。
OCしすぎに注意
AMD Ryzen Master(AMD公式) で3.7Mhz以上ブッコムとBlenderが落ちた。電圧アップやクーラー強化をやりだすとキリが無いため、3625Mhzで終了。
なお、定格(3.4Ghz)だと22.5秒前後になる。
数の暴力を見せつけられると、つい16コア32スレッドのCPUが欲しくなるが我慢しとく。Blenderで遊んでる程度ではそんなもの不要。
Ryzen 9 はまだ高い。けど、どうせ数年内に全部12~16コアになるのだろう・・・その時買えば良し。
Core i7 5960Xが出てからたった5年、Xeon X6550が出てから、まだ10年も経ってない事を考えると・・・ねぇ・・・
GPUのみ タイル1024×1024
22.78秒を記録。
CPUの方がやや速いという結果になる・・・メモリ使用量も多く、発熱も大きい。危険な香りが漂っていたためOCは中止(このグラボはメーカーOCモデル)。
レンダリング結果から、「RX570≒Ryzen7 2700」になるようだ(あくまでBlender@fishy catの場合)。
というか、前回も同じような結果だった。やはりBlender的には、ミドルクラス以下のグラボを導入する意味はあまり無さそうだ。
現状(2019年末~)Ryzen 7 2700クラスのCPUは割と安い。
Blender目的にグラボを買うならGTX1660Tiクラス以上は必須。価格的に1660では微妙。
少なくともRX570を買ってもほとんど意味がない事は解る。どうでも良いグラボを差しておいてその分CPUに投入するか、CPUを抑えてGTX1660Ti以上を買った方が良さげ(ただし、これで実際速くなるかは解らない)。
CPU+GPU タイル32×32
21.04秒を記録(コンポジティング有にすると82秒)。
たいして速くならない!
まぁ、16スレッドから1スレッド増えても、最大6.25%しか変わらない・・・という事だ。
GPU複数差しすると比例して効果が出るのか(動くのか)は未知数だが、Blender的にはGTX1650の連装などもアリなのかもしれぬ。いや、それならRTX買った方が良いか・・・
CPU+GPU タイルサイズ変更時
次に、CPU+GPUの設定を入れたまま、タイルサイズを変更してみた(16+1スレッドでレンダリング)。
出力画像は全て同じであり、省略する。
なお、32×32の場合、480分割になる。
- 8×8 21.85秒(最小サイズ)
- 10×10 21.49秒
- 20×20 21.28秒
- 40×40 20.66秒(312分割)
- 50×50 20.44秒
- 60×60 20.56秒
- 70×70 20.45秒
- 80×80 20.74秒
- 90×90 21.05秒(72分割)
- 100×100 21.30秒(55分割)
- 125×125 24.05秒(36分割)
- 150×150 28.42秒(28分割)
- 175×175 35.11秒(18分割)
- 501×23 21.79秒(解像度の倍数)
fishy catの場合、鼻と髭の部分の処理が最も重いため、ココに割り当てられたスレッド(コア)が足を引っ張る。
つまり、1スレッドが21秒未満で処理できるのは、100×100の10000ピクセル前後らしい(重ねて言うがfishy catの場合)。
まとめ
オブジェクトの形状等による個別チューニングが必要なようだ。
とりあえずは、32~64ピクセル程度にしておいてCPU+GPUの設定にしておくのがベターか。
数年前は、グラボでの計算(GPGPU)メインの方がコスト的には優勢だったようだが、ミドルハイクラスのCPUですら10スレッド以上が標準になった今では、多コアCPUで攻めた方が良いのかもしれない。
少なくともBlender用途だと、Ryzen7 2700が2万以下で買えるようになった現状、GTX1650やRadeon RX570を導入する意味は、ほとんど無い。
しかしまぁ・・・レンダリングエンジンの仕様が変わったら全部パーなので・・・投資は自己責任で。
実際確実に2.80→2.81でCyclesエンジンの何かが変わっている。明らかに色味が違い、GPUモードは少し速くなった。
OptiX、RTコア、Vulkan あたりの対応のため何らかの変更が入ったのかもしれない・・・