ishikawashの学習ノートスマートフォン用の表示で見るishikawashの学習ノートこの広告は、90日以上更新していないブログに表示しています。マルチテクスチャーでレンダリングしているだけ。キューブマッピングで使うテクスチャーは自作ツールで生成した。シェーダーは以下の通りすごく単純。特定の条件下では高速化の手法として結構有効かもしれない。Lighting前回作ったシェーダーに単純なスポットライト効果を追加してみた。行うことに気づかなくて思いのほか手間取ってしまった。ShadowGLSLでシェーダープログラミング始めた。今後はレイトレは一旦休止してリアルタイムレンダリングに力を入れていく予定。個人的には、フォトリアリスティックとは別の路線を探っていきたいと思ってる。PythonPythonによる習作。検証するサンプルコードが欲しかったので作ってみた。Metaprograms前回に引き続いて再びC++Reportから。今度はテンプレートメタプログラミング(TMP)の記事を読んでみた。TMPとは、簡単にいうと、テンプレートを特殊化するプロセスを応用してコンパイルと同時に実行結果を生成するテクニックといっていいのだろうか。コンパイラをあたかもインタプリタのように振る舞わせることで、通常のマクロ展開よりも遥かに強力なプリプロセッサ機能を利用できるようになる。TMPでは条件分岐やループなどの制御構造をテンプレートの特殊化と再帰呼び出しで表現する。この意味においてTMPは関数型言語と良く似てるといえるかもしれない。ユークリッドの互除法をTMPで書くと次のようなプログラムになる。};};このプログラムでは、アルゴリズムの基本となるループをテンプレート(gcd_t)の再帰呼び出しによって記述し、終了条件をこのテンプレートを特殊化することで定義している。計算結果を取得するには同じく引数を渡してテンプレートを特殊化すればいい。std::endl;テンプレートの特殊化はコンパイル時に行われるので上のコードは実際は次のコードと等価となる。std::endl;このようにTMPを使うと本来実行時に発生する計算コストをコンパイル時に移動させることができるので、パフォーマンスチューニングのテクニックとして大変有効に思われる。その適用範囲は期待する程広くはなさそうだ。本記事ではバブルソートを例に関数版とTMP版の2種類の実装を用意して性能評価を行っていて、関数呼び出しのコストが発生しない分、TMP版は関数版よりも予想通り速い結果となっている。入力の大きさが極小さい場合を除くと両者の間にはさほど大きな性能差を認められない。結局のところ、TMPによるチューニングはあくまで奥の手にすべきであって肝心なのはやはりアルゴリズムの性能なんだということだろう。ちなみにこの記事の初出は1995年。C++の標準仕様が初めてISOに承認されるちょうど3年前になる。してブログを書くついでに昔の記事を掘り起こしてみると、標準化に向けて活発だった当時のC++コミュニティの勢いが伺い知れてなんだか感慨深い。techniqueプログラミング今更ながらC++を学んでいる。単なるOOP機能を備えたCとしてではなくC++固有の機能をもっと活用しようと思ったのがきっかけ。巷ではリーナス・トーバルズ氏のようにC++をボロクソにけなす人達がいるけれど、Cは基本的なデータ構造を扱う標準ライブラリが存在しないのがやはり苦しい。C++を使い続けていくんだろうと思う。いう便利なテクニックを知った。Traitsとは、C++のテンプレート機能を活用してデータ型に関する処理を実行時からコンパイル時に移行させるコーディングテクニック。technique」が詳しいのでそちらを参照して欲しい。導入動機と活用の仕方が詳しく解説されている。Code」で紹介されていた正規表現マッチャをC++で書き直してみた。オリジナルとの大きな違いは、ポインタを直接操作する代わりにイテレータを使用している点とワイド文字列に対応した点。いうクラスを用意した。メソッドが返す値を利用している。クラスに委ねることで複数のデータ型に対応するための煩雑な条件分岐をマッチング処理から排除することができた。出来上がったソースコードを眺めてみると余計なキーワードだらけでとても”Beautiful”とは言えない始末。オリジナルコードが本当に美しいのかどうかはともかく、その特徴だった簡潔さが失われてしまってあんまり良い例ではないよね。techniqueTweet広告を非表示にするもっと読むコメントを書く2008-10-08マルチスレッドプログラミングプログラミング最近、マルチスレッドを使ったプログラムを書くことがあって、これを機にオライリーの「Pthreadsプログラミング」を読んでみました。本書はタイトルの通りPOSIXスレッドAPIの解説書ですが、マルチスレッドプログラミング自体の概要を押さえるのにも役に立つ内容ではないでしょうか。おかげでこれまで曖昧にしていた知識の補完ができて大変参考になりました。プロセスとスレッドの違いスレッドコンテキストとは、すなわちスタックポインタとプログラムカウンタ等のレジスタセットのこと。このコンテキストを切り替えることで、メモリを共有しながら同じプログラム内の異なる命令を並行して実行できる。並列処理と並行処理の違い並列処理とは、異なるタスクを同時に実行すること。並行処理とは、異なるタスクを任意の順番で実行すること。したがって、並列ならば並行は成立するがその逆は成立しない。マルチスレッドプログラムの設計モデルボス・ワーカーモデル、ピアモデル、パイプラインモデル。Pthreadsの実装方法の種類ユーザースレッドとカーネルスレッド、2レベルスケジューリングスレッド。それでも、分かったのはせいぜい抽象的な概念のみ。実装レベルに踏み込むと途端に理解があやふやです。試しにid:naoyaさんのスケジューリング・スレッドに関する過去記事を読んでみましたが、頭が追いつかず途中で息切れしてしまいました。マルチスレッドを利用した小さいサーバーでも書いてみましょうか。実際に手を動かしてみた方が理解が深まりそうですし。ちなみに、MacOSX(というかDarwin)はというと、LinuxのNPTLと同じくユーザースレッドとカーネルスレッドが1対1で対応する1:1モデル。MacOSXは複数のスレッディングAPIを提供していて、各APIの関係は下記のような階層構造になっています。この階層図を見て分かるとおり、Machスレッドの上位にPOSIXスレッドが位置し、そのPOSIXスレッドの上位にCoccoa・NSThreadやCarbon・MPタスク等が位置しています。このように、Machスレッドと上位APIの間にPOSIXスレッドを挟んだ設計のおかげで、UnixソフトウェアとMacアプリケーションが同じ環境下で動作可能な仕組みになっているのですね。参考にした資料が、MacOSXがリリースされて間もない頃の内容で、現在のアーキテクチャがどうなっているかは分かりません。どなたかご存じの方がいらっしゃったらご指摘いただけると幸いです。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。