実際にビルドしてみて使って見ると少しの差でSycl32の方が早かったわけですが、実際の演算結果の差が出るのかどうか気になったので、stable-diffusion.cppで同じモデルを使用してSYCL16とSYCL32でmakeしたものを同じプロンプトで出力させて比べてみました。
ついでにCPUと比べてもみたいわけですが、犬の看板画像で試した感じだとCPUとSYCLでは結構差が出てた記憶があります。
ようやく出そろいました。SYCL16 / SYCL32 / CPUで出力させてみました。
512x512のサイズならvaeもGPUで動く気がしたので試してみたら、出力されたものが真っ白の物でした…どこかで情報が欠落してしまっているようでw
なので、textencoderとvaeはすべてCPU上で動いています。
| SYCL16 | SYCL32 | CPU |
|---|---|---|
CPUだけはおでこの模様が異なってたり、首紐が無かったり、輪郭が違っています。SYCL16とSYCL32の違いはfluxの「f」の文字の太さが違っているのと、背景の左側の人が若干異なっている程度です。
ほぼ、同じ結果を得られていますが、「同じ」出力にはならないのが本当に面白いですね。
乱数誤差なのか内部バッファのメモリ形式が異なっていることによる差なのか…要因はいくつか考えられます。
他にもいくつか同じ構成で違うバックエンドで出力させたものがありますがSYCL16とSYCL32はほとんど違いがないですが、やはりどこか違っている部分があります。バグなのか実装の仕様なのかかなり難しい部分ですね。
参考として出力から得られた実行時間はそれぞれ、456.72s / 440.92s / 997.77s。消費電力は1Step目はそれぞれ15W程度かかっていましたが、2~4Stepの間はSYCL16/32は10W。CPUはすべてのステップでGPU電力は0WでしたがCPUだけで15W消費していました。瞬間的に表示上16.01Wとか表示されてはいました。テキストエンコーダとvaeはCPUのみなのでこちらも15W消費している感じです。
出力が真っ白になってしまいましたが、vaeもGPUで動作させた場合はSYCL16は382.46s、SYCL32は366.12sでした。vaeの処理が滑っていただけかもしれないので、あくまでも参考値として残しておきます。


