1

私は C++ AMP をいじっていますが、何らかの理由で最も馬鹿げたコードがコンパイルされません。これ:

concurrency::extent<2> e(2,2);

concurrency::parallel_for_each(grid<2>(e), [](index<2> i) restrict(direct3d) {
});

次のエラーが発生します。

エラー C3576: 'wmain::': Concurrency::details::_Parallel_for_each 引数 #3 にサポートされていない型 c:\program files (x86)\microsoft visual studio 11.0\vc\include\amp.h があります

ラムダ式が渡されるのが好きではないようですconst _Kernel_type& _Kernel

ノート; AMP サポートを含む Visual Studio 11 Developer Preview を使用しています。「restrict(direct3d)」は、問題のコードを実行するアクセラレータの制御をサポートする新しいキーワードです。

何か案は?いくつかの異なる例からコピーしようとしましたが、何も機能しないため、少し困惑しています。

4

2 に答える 2

3

parallel_for_each に渡されたラムダは空のクラスです (変数はキャプチャされないため、データ メンバーはありません)。データがなければ有用な計算を行うことはできません。そのため、エラーが発生しています。

次のように、concurrency::array または concurrency::array_view を例に追加してください。

using namespace concurrency;
extent<2> e(2,2);
array<int, 2> a(e);

parallel_for_each(grid<2>(e), [&a](index<2> i) restrict(direct3d) {
    a[i] = 1;
});

注:これは、Visual Studio 11 Developer Preview にのみ適用されます。この動作は、今後のベータ リリースで変更されます。コードはエラーなしでそのままコンパイルされます。空のクラスを渡しても何も起こりません。

于 2012-01-10T20:18:29.360 に答える
0

私の知る限り、restrictキーワードは Microsoft が C++ AMP 用に導入した拡張機能です。このキーワードは、Visual Studio 2010 以降の Visual Studio C++ コンパイラでサポートされます。

現時点では 2012 のベータ リリースについては知りません。そのため、新しい C++ AMP について説明している例やブログなどを見つけて、Visual Studio 2010 で動作することを自分で確認しようとしていると思います。

ただし、Visual Studio 2010 に同梱されている C++ コンパイラは、私が知る限り、restrict キーワードをサポートしていません。これが、エラーが発生する理由です。

したがって、C++ AMP については、VS2012 のベータ版がリリースされるまで少し待つ必要があると思います。チャンネル 9 で Daniel Moth のデモを見たときも、確かに指がむずむずしました :-)... 日常業務に C++ AMP が必要というわけではありませんが、かなり興味深い (遊び) 要素のようです。

EDIT1:実際に見回したところ、C++ AMPが利用可能と思われる「Visual Studio 11 Developer Preview」リリースがあるようです(ライブラリと、実装された拡張機能を備えたC++コンパイラも想定しています)。

EDIT2エラーメッセージをもう一度見ると、 VS11を使用しているように見えます(インクルードファイルへのパスに基づいて推測しました(Microsoft Visual Studio 11.0が含まれています:-))。おそらく、ラムダのキャプチャモードを指定して値でキャプチャし、次のように変更可能にする必要があります。

[=](index<2> i) mutable restrict(direct3d) {}

少なくともこれは、ラムダがほとんどの C++ AMP の例で書かれている方法です...

于 2012-01-10T08:28:28.680 に答える