VisualStudio 2010 beta1 を使ってみました。
環境は Windows7 RC + Windows SDK for Windows 7 RC。
とりあえずコンパイラオプションを見ると x64 に arch オプションが増えていることがわかります。
「 /arch:AVX 」すでに intel AVX に対応している様子。
実際にコンパイルすると C5 命令が見えます。
浮動小数演算部分でちょうど SSE/SSE2 命令が AVX で置き換わっている形です。
実行するとやっぱり Illegal Instruction。
float af= 1.3f; C5 FA 10 05 C3 51 0E 00 vmovss xmm0,dword ptr [__real@3fa66666 (13FD5CE2Ch)] C5 FA 11 44 24 74 vmovss dword ptr [af],xmm0
直接 AVX 命令を使うには immintrin.h を include する必要があるようです。
immintrin.h には AVX の 256bit 長のデータ型 __m256 が宣言されていました。
他に追加されたオプションは auto の扱い方です。
VC++ 2010 は auto や decltype といった宣言で型をコンパイラに判断させることができます。
キーワードの意味が変わったので /Zc:auto- で無効にできるようです。
VC++ 2010 はこのように新しい言語仕様を取り入れていて、面白い機能がいろいろ
増えています。
たとえば lambda 式が使えるようになってること。
auto f_mul= []( int a, int b ) ->int { return a * b; };
宣言した無名関数をオブジェクトとして受け取れます。楽しい!
[] は capture の宣言で、クロージャーへ変数を渡す手段を記述するようです。
コピー [=] と参照 [&]、または変数個別に指定できます。
返値の型は return 文で類推しますが引数のあとの -> でも指定できます。
・MSDN Lambda Expressions in C++
auto は型を自動で判別する変数宣言で、型そのものを受け取るなら decltype() が使えます。
&& 宣言は右辺値参照。代入可能な左辺値ではなく、値としての右辺値を
参照で取れるというもの。
・Rvalue Reference Declarator: &&
実際に定数値でも参照可能となります。
この宣言は const でないので書き換えもできました。
int&& dd= 3; dd++;
disassemble して生成コードを見ると、無名の auto 変数へ代入してからアドレスを
取っています。
どうやらこれが本来束縛されていないテンポラリで、右辺値参照によってこのような
無名領域へのアクセスが可能になるようです。
加算もその領域に対して行われています。
実際どのように使えばどんな効果があるのか、下記ページをかなり参考にさせて
いただきました。
・ntnekの日記 和訳:Rvalue References: C++0x Features in VC10, Part 2
特に効率化は期待できるようです。
例えば C++ では一時オブジェクトが何度も生成破棄されることがありますが、
受け取った引数がすでにコピーされた一時オブジェクト(右辺値)とわかっているなら
そのまま再利用してもかまわないというわけです。
コピー元のオリジナルなら左辺値。
右辺値参照の宣言は、一時領域へのアクセス手段を手に入れると同時にこのような区別も可能になります。
非常に面白いです。
今日は本来の作業の目的を忘れてずっと VisualStudio 2010 。