December 27, 2012

[C++]VisualStudio2012とTaskとAMPの入門

これは C++ Advent Calendar 2012 の26日目の記事です
  • C++ Advent Calendar 2012
    (リンク切れ)http://partake.in/events/a02d7049-1473-4b69-b5ad-25ed416c5557

記事に参加されているみなさんは
言語セントリックな感じで記載されている記事がほとんどで…すごーい!

ちょっとわたくしはVisual Studio2012をメインとするC++ 周りについて記載します
(VS2012イケてないとか言わないでくださいね!)

<Visual Studio 2012 への要望>

VS2012がリリースされてからしばらく経ちましたが
Visual Studio 2012 (C++) への要望は、以下の3つが多かったようです
 出展元: 今年の//build/ "The future of C++"
      http://channel9.msdn.com/Events/Build/2012/2-005


1位 : C++11準拠
2位 : XP対応
3位 : フリーのデスクトップ開発環境

さて、このうちで対応されているのは2,3位のもの



2位 : XP対応

2012/10/9リリース
Visual Studio 2012 Update 1
 XP Targeting with C++
http://www.microsoft.com/visualstudio/jpn/downloads#d-visual-studio-2012-update

Windows XPでもC++ランタイムがサポートされたというものです

詳しくは、MSDNブログへ
 →Windows XP Targeting with C++ in Visual Studio 2012
http://blogs.msdn.com/b/vcblog/archive/2012/10/08/windows-xp-targeting-with-c-in-visual-studio-2012.aspx

XP対応へのやり方は簡単で
VisualStudio2012 でプロジェクトを選択した状態で
プロジェクト > プロパティ を開きます

構成プロパティ
 >全般
  >プラットフォームツールセット

vs201200

ここで、XPターゲットにするかどうかを選ぶ項目が増えています

vm201201

ただし、C++ AMP はWindowsXPには対応していないようです




3位 : フリーのデスクトップ開発環境

2012/9/12リリース
Visual Studio Express 2012 for Windows Desktop
http://www.microsoft.com/visualstudio/jpn/products/visual-studio-express-for-windows-desktop

Windowsストアアプリは開発できませんが
これで今まで通りの C++ 開発が可能ですね



1位の C++11完全準拠ですが、これはまだのようです
//build/ でも、C++11については頑張ってます!のようなトークが見受けられました…




<VS2012追加:Task>

言わずと知れた、非同期処理です
例えばサンプルはこちら
task<int> t([]()
{
    return (1);
});

task<void> t2 = t.then ([](int n)
{
   return( n+1 );
});

task<void> t3 = t.then ([](int n)
{
   return( n+1 );
});
int result = t.get()

あれをやった後にこれ。のようなことが出来ます

もうちょっと具体的に書くなら、Windowsストアアプリで利用する
ファイル作成の非同期サンプルはこんな感じです
task<StorageFile^>(
    KnownFolders::DocumentsLibrary->CreateFileAsync(
        "abc.txt", CreationCollisionOption::ReplaceExisting ))
.then ( [this]( StorageFile^ file )
 {
      my_btn_01->Content = "作られたよ";
  });
      ※ my_btn_01 というのはボタンの名前
       自分の”ドキュメント”の下に abc.txt が作られます

続けてカメラ撮影なども、非同期処理になります
↑のサンプルの }); の部分を以下に置き換えると
ファイルを作った後に、カメラ撮影が始まります

}).then([this](task<void> task)
{
try
{
CameraCaptureUI^ dialog = ref new CameraCaptureUI();

dialog->PhotoSettings->CroppedAspectRatio = Size(16, 9);

concurrency::task<StorageFile^> (
dialog->CaptureFileAsync(CameraCaptureUIMode::Photo))
.then([this] (StorageFile^ file)
{
if (nullptr != file)
{
concurrency::task<Streams::IRandomAccessStream^> (
file->OpenAsync(FileAccessMode::Read))
.then([this] (Streams::IRandomAccessStream^ stream)
{
BitmapImage^ bitmapImage = ref new BitmapImage();
bitmapImage->SetSource(stream);
CapturedPhoto->Source = bitmapImage;
ResetButton->Visibility = Windows::UI::Xaml::Visibility::Visible;
});
}
else
{
                my_txt->Text = "カメラ撮影失敗したよ0";
}
});
}
catch (Platform::Exception^ ex)
{
my_txt->Text = "カメラ撮影失敗したよ1";
}
});

このように、task の中でも task が書けて、入れ子にできます

全てのソースはここに上げていますので参考までに


<VS2012追加:AMP>

こちらは、並列処理
#include <amp.h>

int                              v[ 4 ] = { 0, 1, 2, 3 }; 
array_view<int>    av(  4,  v  );

parallel_for_each( 
    av.extent, [=](  index<1> idx  ) restrict( amp )
    {
          av[idx] += 1;
});
この例だと、配列の4つの要素に1を足していくので
スレッドが4つ走ります

もちろん、複雑な処理や、順序が必要な処理では利用できません

並列処理部は GPU 処理です
わたしはそれほど深く理解している訳ではありませんが

ゲームで言うところだと
 ・描画の設定→CPU
 ・描画処理→GPU
という感じです

そしてなんと、Visual Studio 2012では、GPUデバックが可能です
しかし CPUデバック中は GPUデバックは出来ず
逆に GPUデバック中は CPUデバックは出来ません

vs201202

普通は CPUデバックのモードです

GPUデバックの変更は プロジェクト > プロパティの
構成プロパティ
 >デバック
  >デバッガーの種類
ここを「GPUのみ」にするとOK

vs201205


GPUデバックが出来るようになった代わりに
CPU部にブレイクポイントを置いても、止まらなくなりました

GPU部で停止出来るというのは、やっぱり嬉しいですね
通ったか通ってないかとかもですが、どれくらいスレッドが立ってるかなども見れるので
初めてこの機能を知った時には感激しました

なんてことないコードですが、いちおうここに上げておきますね

Visual Studio 2012 C++への私的入門編はいかがでしたか!?

記載が遅れてしまって申し訳なかったです
次は @arisinn さんにバトンタッチ!

※2012/12/28 誤字を修正しました
 指摘くださった@cpp_akira さんありがとうございます!


haruka_sao at 22:25コメント(0)C++ | プログラミング 

コメントする

名前:
URL:
  情報を記憶: 評価:  顔   星
 
 
 
Sao's Tech Memo
mvp_logo_140

Microsoft MVP for Developer Technologies
[Jul,2018-Jun,2022]
Microsoft MVP for Windows Development
[Jan,2016-Dec,2018]
Microsoft MVP for Windows
Platform Development
[Jan,2015-Dec,2015]
Microsoft MVP for
Client Development
[Jan,2014-Dec,2014]
Microsoft MVP for Client App Dev [Jan,2010-Dec,2013]
Recent Comments
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

記事検索