実行ファイルにPython埋め込みでスクリプト処理させる

 とりあえず、サンプルになっている処理を書き換える形で試してみた。

 動作的には、以下の通り。
 ・自作のEXEを起動
 ・EXE内でPythonモジュールのメソッドをコール
 ・呼ばれたメソッドは、渡された値を処理して値を返す

 ポイントは、呼ばれたメソッド内でimportするモジュールが、自作のEXE内で登録したモジュールであるという所。
 Pythonスクリプトから自作のEXEを経由して別のプログラムを呼び出し、その結果を実行中のPythonスクリプトで処理できるので、自由度の高いPythonスクリプトを記述できるようになる。

 いろいろデータハンドリングが面倒なので、すんなりは出来ないかもしれないが、より自由度の高いPythonスクリプトの実装が可能になる。
続きを読む 実行ファイルにPython埋め込みでスクリプト処理させる

Boost.Pythonをビルドするには…

ライブラリのビルドがデフォルト設定に入ってないっぽいので、めも。

基本的な手順は、以下。
C++のクラスをPythonから使うためにBoost::Pythonを使うまで

自分の場合は、”user-config.jam”を書かないと駄目だった。

boost_1_71_0の場合には…
“boost_1_71_0\tools\build\example\user-config.jam”を、解凍した“boost_1_71_0”フォルダ直下にコピーして編集。
※Python3.7の場合は、以下のように記述した定義を一番最後の行にでも書いておく。

b2の実行時の指定を、以下のような感じに。
※ なかなかビルドがうまくいかなくて最終的に “–with-python” 指定をしているので、もしかするとPythonライブラリだけしかビルドしないかも…

Boost.Pythonを使うと

 .pyd モジュールを作る時の記述が、C言語で書くよりかなり簡略化できてちょっと試す時に便利。
 .pydファイルはDLLなので、関連へのパスを通しておく必要がある。(例えば、boostのlibフォルダ)
 もしimportで.pydモジュールがロードできない時は、関連のdllを読み込めてないので注意。

 Cで書くと、こちらの参考サイトみたいに、いろいろ定義が必要になる。

 ビルドについては、以下のような感じで。

記述時の参考に

【Python C API入門】C/C++で拡張モジュール作ってPythonから呼ぶ -前編-
c/c++をラップしてpythonで使えるように

続きを読む Boost.Pythonをビルドするには…

Mayaをコマンドラインから立ち上げる

前回ちょっとしか書かなかったので、もうちょっと追加。

自動実行のmelを利用するには、

拡張子”.mel” のファイルを作成して、その中にmelで実行したい処理を列挙していけばOK。

もしバッチ実行ではない場合は、実行する処理の最後に quitコマンドを記述しておくことで、自動的に終了させることも可能。
但し、usersetup.melやusersetup.pyで起動時に独自に起動処理を設定している場合や、起動直後に新機能などを表示するダイアログを自動表示させる設定になっている場合には終了に失敗する場合があるので、まずはダイアログを自動表示させる設定はOFFにしておいて欲しい。
起動処理を設定している場合は使用しないように対処したり、evalDeferredコマンドを使用して、自動実行したい処理を遅延実行させるような対応が必要になる。

上記のように、バッチ実行ではない場合には自動終了時に面倒が起こる場合があるので、GUIや画面表示が存在しなくてはならない処理を実行する必要がない場合以外は、基本バッチモードでの実行が無難。(但し、playblastなど画面表示の機能が稼働していないと動作が得られないものもある点に留意。)

そういえば、参考サイトのサンプルのバッチファイルの記述では、Maya.exeを起動した場合にはスクリプトの自動実行を行わないような内容になっているが、MayaもMayaBatchもその辺りの設定項目は同じなので、通常のMaya起動からの自動実行もバッチファイルを少し変えてやれば可能になる。
一番最初のハードルは

環境設定群だと思う。
とても基本的な部分なのだが、通常は特に設定を変更する必要なく使えてしまう部分な上、変更すると使えていたものが使えなくなってしまい、元に戻せなくて焦る…といったことも起こりやすい。
この部分を試すにしても、冒頭の参考サイトにあるバッチファイルによる設定が活躍する。
バッチファイルで実行するぶんには、Windowsに直接設定されている内容を汚すことはないので、存分に設定を弄り倒すことができる。(但し、既にWindowsに設定された内容を引き継いでしまう部分があるので、逆に設定を消すようなバッチファイルの記述が必要になる場合がある点には留意。)

環境設定の学習が進めば、複数の環境を切り替えながら使うことも出来るようになるので、頑張って習得するのが良いと思う。

追記

maya.envにて、環境設定をカスタマイズできる事を知らなかったもので追記しておく。

Windows環境における環境変数のこと

めも。

昨日仕事場で、プロセス起動がうまくいかないんですけど…という質問から、そもそもWindowsにおける環境変数の設定とかどうなってんだかそんなに詳しく知ろうとしてなかった事に思い至り、ちょっと検索してみたら出てきた。

仕組み的な話、あれこれ
Pythonでプロセス起動的な話

Python:subprocess.Popen(..)での環境変数のエクスポート

ぶっちゃけcmd.exeにコマンド文字列渡すのが一番手っ取り早く、仕様的に変化もないと思うけど、たまには仕組み的な事も知ろうとしないとね…という事で。
※PythonでPopenする場合は、shell=True って書く方が良かった事も今更思い出さされた…

[PySide] Maya、Windowsスタンドアロンの記述

少し記述に違いがあったり、モジュールとか環境の違いも出るので、メモが必要な感じ。

極端に古い環境を考えても仕方ないけど、そもそも自分も結構古い環境なので、現行との違いとか忘れてしまうのもある…

2014/2016/2018で考えてみたい。

PySide/PySide2

PySide1: 2014, 2016
PySide2: 2018(※2017から、PySideのバージョンが変わってる)

shiboken

2015/2016辺りでMixin記述が出来るようになったので、2016, 2018はshiboken不要。
2014の場合はshiboken入れるなり、MayaのWindowハンドルを取得するなりして、PySide側のWindowにParentの設定が必要。

QApplicationのinstance生成

これは、スタンドアロンとMayaの場合で実装が異なる。
スタンドアロンの場合は、よくあるexampleのようにインスタンスを生成すればいい。

Mayaの場合は、既にインスタンスが作られた状態から動かすので、必要に応じてinstanceメソッドでインスタンスを取得する。

でも既にイベントループとか動いているので、app.exec_()しなくてもウィンドウ作成&表示で動き始める。
必要なら呼べば大丈夫な感じ(そういえば、これはOKなのか?)ていうか、要らない。

[Windows] キーボードのCapsLockキー入力をCtrlキー入力に変換

掲題の通り。
仕事場で英字キーボードを使っているが、左Ctrlキーは日本語キーボードのCapsLockキーの位置にある。
配置関係的にCapsLockと位置が上下逆転しているので、英字配列を使う人はよくキー入れ替えをする。

MS提供の設定変更ツールというのを見たので、メモしておく。

これを使ってみると、Ctrlの入力がCapsLockでも出来るようになった。(左Ctrlキー入力は、元のまま。)
CapsLock入力が消えたけど、そもそもそのキーを使うことがほぼないので、これで良いか…って感じ。

もしCapsLockを必要に感じたら、今度は入れ替えツールを探してみようかな。

DirectX12のマルチGPU

 OpenCLとかRadeonのCrossFireばかり気にしていたけど、DirectX12のマルチGPUの機能が思ったより凄いかも。
 RX580で2万くらいの出物があったので、手元のRyzen2700X+RX570とセットでTimeSpy(futuremarkのベンチマーク)を試してみた。

 スコアはTotal:7726, Graphic: 7600(Test1:51.58, Test2:42.11), CPU:8534だった。
 ググってみると Ryzen1600X+RX580でTotal:4156というのを見つけたので、どうやらマルチGPUでそこそこ性能が出るというのは嘘じゃなかった。

 しかもDirectX12のEMAという機能は異機種混合を可能にするらしくて、単なるモデル違いだけでなくメーカー違いもサポートする模様。またGTX970x2ではSLI接続より効果が上がったという結果も見つけたので、そもそも技術的にかなり最近のGPUのレンダリング パイプラインを効率化する方法を導き出したということのような気がする。

 …のだが、そんなに凄いという噂を目にしなかったのは、単にそちら方面にアンテナ伸ばしてなかったからなのか、それともじつはそこまでの効果が出ることが稀なだけなのか。

 実のところ、そこら辺がよく判らないでいる。

その後

 DiRT Rallyを動かしてみたら、RX570単体が平均で60fps前後 ⇒ RX580+570では100fps超になっていた。1.6~1.7倍ほど処理が増大した。そもそも、RX570⇒RX580で12,13%早くなってるというのもあるけど、かなり上乗せされてる感じがする。
 DX11のゲームなので、DX12ネイティブなゲームだともっと上乗せされるのかしら。

AMD APP SDKが見当たらない…

めも。

 CUDAが環境的にナニだったので、OpenCL調べてみるか…と思ったのだが、調べていくとAMD APP SDKが必要…みたいな話になってきたので、AMDでSDKをDLしなきゃーって思ったのだが、何故だか見当たらない始末。

 理由は不明だが、2018.12.2現在公開されている気配がない。

 で、こんな書き込みを見つけた。
 OpenCL SDK

 どうもここからもらってくる感じになってるみたい。
 AMDのドライバ(Radeonドライバとか)にはそもそもランタイムとしてOpenCLが含まれているらしく、とりあえずそこに置いてある include, libファイルでビルドすれば動くっぽい。

 参考サイト①にあるデバイス確認のコードで、実際に動くことも確認できた。

参考

C++でOpenCL(環境構築編)
SDKなしでOpenCLを使ってみる -導入編-
Khronos OpenCL Registry(仕様策定をしている団体のページ)
公式のリファレンス

PythonでCUDA (…ならず)

CUDAをローレベルで書くとか言っても、ゴリゴリとコード書くほどではないので、なんだかな〜…と思っていたのだけどcupyとかpycudaとか見つけてしまった。

で、とりあえずcupyを入れるも、なにやらアーキテクチャが合わないみたいなエラーで止まってしまい動作確認できず。
pycudaはCUDA2.0〜対応しているというので、インストールしてみたのだが、これまた動かず。

どうやら、どちらもビデオカードに積んでいるCUDAのバージョンが古いので動かない…という結果に。

いやいや、待ってよ…
「pycudaはCUDA2.0〜対応」じゃないんかよ!って思ったんだけど、そもそもCUDAの動作環境としてインストールしている「CUDA toolkit」なる動作環境が間に噛んでおり、toolkitにもまた対応するCUDAのバージョンが…。

toolkit9.1の場合、それが3.0以降なので対応できぬ、という話だった。

現状linux機に積んでいるGPUはFermi世代(CUDA2.1, 具体的にはquadro600)なので、Kepler以降のもの(例えばquadroK600など)に変えないと駄目そう。
敢えてtoolkit9.0にダウングレードするという選択肢もあるみたいだけど、ソースからインストールするのではゴリゴリコード書く人と変わんなくないですか…ってことで、そのうちGPUを変えたら再度検証したい。
(Windows機に乗ってるGTX950でもKeplerの次のMaxwell世代なのでそっちなら動かせるんだけど、個人的にlinux活用週間なのでこっちで遊びたい…)

…考えてみるとpycudaではコードゴリゴリ書くのとあまり変わんないような気もするし、その際はnumpy準拠(?)のcupyで行きたい。

そもそもCUDAのローレベルのコードというのは

 どんなものか? という話もあるのか…

 CUDAの基本的な動作パターンは、大雑把には以下の通り。

 ・予めCPU側で計算する値の配列情報を用意
 ・用意した配列をGPU側に転送(メモリ確保&コピー)
 ・GPU側で実行する計算処理を指定してGPU側の計算を実行
 ・GPU側の計算が終わったら、GPU側からCPU側に結果を転送(メモリ確保&コピー)
 ・GPU側のメモリを開放

 pycudaの場合は、これを概ねそのままPythonで記述する感じ。
 cupyの方は、基本numpyと同じような記述で済む。

 どっちだって同じじゃね?と思うかもしれないが、例えば「GPU側で実行する計算処理」はPythonではなくて nvcc でコンパイルするものをそのまま書く感じなので、ここはC言語に準拠した記述になる。これをpycudaでは文字列で扱うし、他の要素に関してもあまりPythonぽい手続きには感じない。
 numpyはそもそもPython記述で処理を書き連ねる感じになっているので、Pythonコードを書くというその部分でストレスを感じずに済む。それだけで、numpy準拠であるcupyは意味がある。

pipを実行しようとすると、「Fatal error in launcher: Unable to create process using ‘”‘」のようなエラーが..

めも。

どうも、いろんなバージョンのPythonを単純にインストールしていると発生することがあるみたい。
幾つかのバージョンのPython環境が欲しいなと思って、インストールしてはその構成を別の場所にコピーしてアンインストール。というのを繰り返していたのです。

で、解消方法はこんな感じだった。

複数バージョン入れてると、pipに必要なモジュール構築がおかしくなるのか…
でも、pipのupgradeで治ってくれるのは助かる。

こうならない為に
インストールの仕方ひとつで問題解消できる模様。⇒これ
複数バージョンの共存にも。

vulkan弄ってみた

 OpenGLとかDirectXとか2000年代半ば頃までは弄っていて、なにかの時に簡単なサンプル作ったりくらいはでっち上げる感じだったけど、そもそもsmoothbindとかshaderとか分離され始めた頃からリアルタイムエンジンが複雑化してきて、そういうのを追うのが面倒になってしまい、今ではすっかりご無沙汰です。

 隣の席の御大がめっちゃシェーダー職人はじめました。って感じで、凄いな~と思ったので、この機会にすこしvulkan弄ってみようかな…と思ったり。
 去年の7月くらいにGTX950導入したのに全然活用してない…というのもあるし。(というか、実は買った割に使わないのでQuadroFX370に戻してたけど、vulkan対象外っぽいのでGTX950入れ直した)

 以下、Windowsにおける導入までの流れ。

導入
LunarGサイトに説明ページを見つけた。
あとVulkan Tutorialなるサイトも。

 まずvulkan対応のGPUドライバと、vulkanSDKを入れる。

 SDKには、demosとsamplesという2つの導入説明用のフォルダがあるけど、samplesを利用するには cmakeと python3, VisualStudio(2015以降)が必要になる。
 VisualStudioは、仕事で使うのでなければCommunity版が利用できるので、これを使った。
 cmakeは公式からDLしてインストール。パスは環境変数に設定しておくか、サンプルのバッチ(Samples/build_windows_samples.bat)でパスを通しておく。
 Python3の方は、同じように公式からDLしてパスを通す方法と、VisualStudioのPython環境インストールの2通りの方法がある。(VisualStudioでPython環境を入れみたら、Python3の環境設定不要でサンプルのバッチを実行可能だった。)

 上記の準備が出来たら、サンプルのバッチを実行する。
 それなりに処理に時間が掛かるので、お湯でも沸かしてお茶でも飲むとか、洗濯でもして待っていればそのうちに終わる。(お茶飲みながら洗濯していたら、気づいた時には終わっていた)

 バッチ実行が終わったら、Samples/build/VULKAN_SAMPLES.sln でソリューションを開くと、いろいろサンプルを試すことが出来る。

 当初、QuadroFX370で試したら、Samples/API-Samples/01-init_instanceでは”cannot find a compatible Vulkan ICD”とか出るし、02-enumerate_devicesでは、assertが上がって初期化がまともに成功しない…という結果に。(対応環境ではないから…)

 GTX950に入れ替えて、ようやく動作。
 でも、サポート範囲はvulkanAPI1.0のみ。最新はAPI1.1なので、vulkanの機能をフルに活かそうとすると結構高いスペックが必要そうだ。

基本のサンプルでは足りない場合

 SDKのDemos, Samplesの方は、本当に基本実装のサンプルなので、知識が足りない場合はいろいろ参考を探した方がいい。
 NVIDIAはスペックデモ用のサンプルをNVIDIA GameWorks Vulkan and OpenGL Samplesで公開していた。

 あと、英語だけどまとめサイト的なものを見つけた。

 まずはこの辺で、出来ることを探ってみるといいかもしれない。

FBX SDK

 これ少し調べる機会があった。
 いきなり何もなしで始めるより、こういうのを利用して最終的に自前のフォーマットを構築するのが良さそうね。