Неподдерживаемая ошибка типа с parallel_for_each - PullRequest
1 голос
/ 10 января 2012

Я играю с 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

Заметка;Я использую Visual Studio 11 Developer Preview, который включает поддержку AMP.«restrict (direct3d)» - это новое ключевое слово для поддержки управления тем, какой ускоритель запускает соответствующий код.

Есть идеи?Я пробовал копировать из нескольких разных примеров, но ничего не работает, поэтому я немного озадачен.

Ответы [ 2 ]

3 голосов
/ 11 января 2012

Ваша лямбда, переданная в 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.Поведение изменится в следующей бета-версии.Ваш код будет скомпилирован как есть, без каких-либо ошибок.Прохождение пустого класса просто ничего не сделает.

0 голосов
/ 10 января 2012

Ну, насколько мне известно, ключевое слово restrict является расширением, введенным Microsoft для C ++ AMP. Ключевое слово будет поддерживаться компилятором Visual Studio C ++, который поставляется после Visual Studio 2010.

В настоящее время я не знаю о бета-версии 2012 года, поэтому я предполагаю, что вы нашли примеры, блоги и т. Д., Описывающие новый C ++ AMP, и пытаетесь увидеть, как он работает для себя, но с Visual Studio 2010.

Компилятор C ++, который поставляется с Visual Studio 2010, однако, насколько я знаю, не поддерживает ключевое слово restrict. Вот почему вы получаете ошибку.

Так что я думаю, что для C ++ AMP нам придется немного подождать бета-версию VS2012, пока мы не сможем поиграть с ней. Мои пальцы, конечно, тоже чесались, когда я увидел демо от Daniel Moth на 9-м канале: -) ... Не то чтобы мне нужен C ++ AMP в моей повседневной работе, но это выглядит довольно интересно (играю).

РЕДАКТИРОВАТЬ1: На самом деле я посмотрел вокруг, и кажется, что есть Выпуск "Visual Studio 11 Developer Preview", где C ++ AMP, кажется, доступен (библиотека, и я предполагаю также компилятор C ++ с реализованными расширениями).

EDIT2 Теперь, снова глядя на ваше сообщение об ошибке, может показаться, что вы используете VS11 (я сделал это предположение на основе пути к файлу включения (он содержит Microsoft Visual Studio 11.0 :-)). Может быть, вы должны попытаться указать режим захвата лямбды для захвата по значению и сделать его изменяемым, как это:

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

По крайней мере, так написано лямбда в большинстве примеров C ++ AMP ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...