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

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

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

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

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

Pythonの仮想マシンの処理

Pythonの仮想マシンの処理について解説しているページを見つけたので、めも。

dis/inspect モジュールと ceval.c を使った Python のハッキング

Python Virtual Machine 関連のソース・コード

python のデコレーター構文@decorate

このくらいコード読めないと、埋め込みの実装とか難しいかなぁ…

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をビルドするには…

今更USD@PIXARの記事を読み返す

USD (ユニバーサルシーンディスクリプション)@takahito-tejima

 今読むと、最初の頃にUSDに見ていた物とは少し違う視点になったかも。
 特定のDCCツールに組み込みで利用するっていう面もあるけど、肝はそこではないんだよな…っていう部分も見えるというか。尤もHydraを使うってなると、既にpluginが用意されてるツール以外は1から組み込む必要があるし、その辺は既に組み込まれてるソフトの方が当然導入しやすい。

 肝のデータ構造と非破壊の性質を、どこまで利用できるかなーって考えてようやくスタート地点に立つ感じ。。

[OpenCL] 少し動かしてみたけど、結構情報が当て嵌まらない

 なんだろう? AMD環境って、今OpenCLのメインストリームじゃないのかな?
 検索して出てくる情報は、Intel系…というかMacの情報が多くて、そもそもうちの環境だとCPUがデバイスとして列挙されないんだけど…どゆこと??って感じになっている。

 とりあえず、下記のサイトとかでサンプル拝借しながらdeviceinfoを集めるところからやっているけど、自分で何とかしていかないと試しに人に倣って試してみる、という訳にはいかないかなぁ。

 ちなみに、参考のサンプルはWindowsで動かすと足りないものがあったりするので、処理を省くか、なんとか処理を補完しないと動かせなかった。。

参考

Dakkers/OpenCL-examples
tzutalin/clDeviceQuery.cpp
OpenCLに対応するデバイスの列挙(C言語・Mathematica)

その後

C++からOpenCLをラクに使うためにライブラリを書いてみた

 これも、うちの環境と違う。
 どうやらうちの環境だと、ユニファイドメモリをサポートしてないっぽい…(この方が言うには、「サポートしていないハードがないので動作未確認」とな。そんなに珍しい環境なのかしら?)

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(仕様策定をしている団体のページ)
公式のリファレンス

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

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

OSXで PCM再生(問題発生…)

 CoreAudioとか覚えるの大変そう…という理由で、OpenALを弄り始めてみたり。
 …しかし、それすら調べるのも面倒に感じてしまい、kindle本「チュートリアル形式ではじめるOpenAL」を見ながら、動かしてみることに。(なんという、ぐーたら)

 ちなみに、以下はまだ基本の出力デバイスとコンテキストを用意しただけで、音を出す処理は入ってない。

しかし、早速WARNINGと共にこんな出力が…

 ArturiaVみたいなソフトシンセをインストールしてると、OpenALって上手く動作しない可能性あるんだろうか…

 上記WARNINGは、単に不要な出力だけで済んでいるけど、正直消したい。が、これを消すのを調べるのは、結局1からOpenAL学ばないと無理。。

 なんかいきなり面倒くさいパターン遭遇で、出鼻挫かれたナリ。(=_=;

その後…

 一旦そのままチュートリアルを進め、サイン波の生成及び再生の確認は出来たので、PCM再生をしたい人は上記のkindle本とか読んでみるのもいいかもしれない。
 チュートリアル形式なので、その通りに手順を進めることが出来れば、サイン波を鳴らすことが出来ますw

 とりあえず、自分は「サウンドプログラミング入門 -音声合成の基本とC言語による実装-」とかを読みながら、PCM再生実装の基本的なことを試してみる予定。

 理論から攻めてみようと本を物色していたけど、結局学校の勉強みたいな方法で攻めるのは苦手なので、実践から攻めることにしました。

ダブルバッファでストリーミング再生する方法は、この回答みたいな話でいけるのかしら?
http://stackoverflow.com/questions/13907289/circular-buffers-in-openal
ストリーミング再生で調べたら、まんまの記事があった。
https://www21.atwiki.jp/opengl/sp/pages/174.html

C++の多重継承の罠

本読んでて、あー忘れてるなーと思った話なので、めも。

このへんとかこのへんを読むと言及されているが、C++言語仕様的な話。

 クラス継承をした新しいクラスのインスタンスを生成すると、親のコピーと1セットでメモリ配置されることになるのだが、ダイヤモンド継承の形になった場合に、親のコピーの中に”同じものが2つ生成されてしまう”という問題が起きる。

 C++の場合”仮想クラス(virtual)”という定義があり、これを大元のクラス定義に使用することで、問題を解消(最終的にメモリ配置される場合に、1つだけメモリ配置するように自動調整)できる。

C/C++を学ぶ際には

 「内部動作やメモリ配置についてよく把握しなさい」と釘を刺されるが、こういった問題がポピュラーなことが要因。

 忘れないようにしたい。。