Pythonの高速化するならCythonで…

 という話もあるので、めも。

結論から言うと

 既にPythonで書いたコードがあるなら、Cython向けに既存のコードを整えて.pydを生成する方が楽かも。
 まだPythonで書いたコードがなくても、Pythonに親しんでいる人はCythonがいいかも。

 ならC言語使って.pyd作る理由なんてないじゃん。という意見も出るかもしれないけど、Pythonで閉じた環境で完結できるならそうだと思う。

C言語を使うメリットを考えてみると

 以下のようなことが思いつく。
 ・既にC言語で何らかの処理を書いている
 ・他のC言語ベースのライブラリを併用する
 ・Cで書く方が最適化の効果も得やすい可能性(Cythonとの比較で)
 ・並列化処理(マルチスレッド)の導入
 ・ゴリゴリにクロックやメモリサイズを削る最適化をしたい

 ただ、ゴリゴリに最適化する人はかなり限定されるハズなので、実際には既存のCライブラリの利用やマルチスレッドの導入がメインになりそう。

 DCCツール向けに開発している人だと、開発用のAPIはDLL提供されてるし、大量データの計算にスレッド処理も導入したくなるハズなので、頑張ってC言語を覚えるのも面白いのではないかな、と思います。

 Windowsだと環境整備が面倒、とかはあるかもしれませんが。。

Pythonの仮想マシンの処理

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

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

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

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

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

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

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

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

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

参考

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

その後

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

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

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

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

C++の多重継承の罠

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

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

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

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

C/C++を学ぶ際には

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

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

C++でデータベースにアクセスしてみる

 C++からDBのデータを取得する方法を書こうと思ったのですが..
 書いてみると、DBを知らない人に非常に障害の多い内容であることに気付きました..

 DBを利用できると、整理された表からデータ引用がしやすいので複雑なデータ管理ができるようになるのです。
 でも、そもそもDB利用までの事前作業(DBエンジンのインストール、データベース・テーブルの作成、プログラムからDB接続する手段の準備)がいろいろと煩雑で、ある程度サーバの理解があるような人でないと、なかなか接続までの道のりが遠く険しいものになります..

 Windows&SQLServer(のlocalDB)であっても、SQLServer&ManagementStudioのインストール、localDB設定、データベースの作成が必要です。
 またC++による接続手続きもODBCオブジェクトでラクラク!というものではないですし、接続後にはSQL文というハードルも待っています…

 とても、5~10分でラクラクデータベース入門。というような内容にはなりません。
 (どっちかというと、10日間集中強化合宿!くらいのスパルタ学習が必要でしょう…)

 なので、以下の内容はなんとなく繋ぐまでの参考程度に見てください。

 見終わった時…せめてDB活用のためには、データベースおよびSQL文についてそれなりに学習が必要になることがわかれば幸いです..

続きを読む C++でデータベースにアクセスしてみる

C言語のプログラミングを学ぶには

 Windowsの開発環境であれば、以下のサイトで手に入ります。(C/C++/C#/VBのプログラミングができます。)
 Visual Studio Express 2013 for Windows Desktop

【追補】
 制限はありますが、コミュニティ版という全プラットフォーム対象バージョンもありました。
 Visual Studio Community 2013

 いろいろ方法はありますが、お金を掛けず気になる部分だけ学ぶ手っ取り早い方法は、ネット上に公開されているサンプルコードを自分で動かしてみることかと思います。
 コード レシピ:サンプルコードから学ぶ

 モノによっては、タダでは環境を用意することができない場合もあるかと思います。
 自分に投資してもよいと思うことであれば、上手にお金を使うのも1つの道です。ケチりすぎも大盤振る舞いも無駄なので、そのあたりはできるだけ情報を集めて、必要なところに必要なお金を出す道を探してください。そういうのも大事な勉強です。

 コードを動かしながら学ぶ以前に、プログラム言語の文法などに馴染みのない人はいきなりC++を学ぶよりも、VB/C#などでプログラムの動きのイメージを学ぶことが先かもしれません。
 ※C/C++言語は事前の準備に比較的煩雑な面がある上に毎回実行コードの生成と実行をしないといけないので、短いコードを書いてはすぐ実行して結果を得る、というようなトライ&エラーによる学び方には向かない傾向にあります。

 ただVisualStudioはリアルタイム・デバッガが強力なので、実行用のファイルが作れるようになれば動きも追いやすく学習がそれなりに捗るようになると思います。

 ところで…

 C/C++言語を学ぶ上でつまづくポイントは、たぶん言語仕様やアルゴリズム学習などではなくて、基本ライブラリの少なさ、ビルド用の設定記述、コンパイラのワーニングやエラーへの対応などではないかと思います。特にワーニングやエラーへの対応は比較的知識や経験が求められる部分なので、プログラムを学ぶ作業とは違う労力を要求されます。
 もし学びたいのがC/C++言語そのものではなく、なんらかの汎用プログラム言語であればよい。という話であれば、JavaやPythonなど別の言語をまず学ぶことをお勧めします。

 C/C++言語のメリットは、とにかくCPUに寄り添ったレベルでのプログラム開発ができることにつきます。
 JavaやPythonの場合は、直接CPUが解釈できる機械語を出力する作りではありません。あくまでもJavaやPythonというアプリケーションがまず動いているのが条件で、その上で自分の書いたプログラムが動きます。
 C/C++言語の場合は対応するCPU向けに機械語を出力するので、CPU上で直接動くプログラムを作ることができます。

 これにより、余分なプログラムが動くメモリ領域も処理も間に挟まないプログラムが作れます。
 理論的には最少かつ最速のアプリケーションを作成することができることになりますが、ほとんどなんの助けも間に挟まれないことになるので、プログラマの技量が処理結果にもろに影響します。

 趣味や片手間でプログラムをするには効率の悪さが目立つ言語なので、よほど速度やサイズの制限がキツイ状況でない限りは、別の言語を使った方が利口な選択と言えるかもしれません..

 とか言いつつ、『連載:簡単! Visual Studio 2013入門』という啓蒙だか販促だかの記事を見つけたのでいちおう貼っておく。