"Параллелизм": пространство имен с таким именем не существует
Я - программист-любитель C#, который забрел на C++ из-за необходимости в технологии C++ AMP для некоторого сложного перебора чисел. Следовательно, мои навыки программирования на C++ не очень хорошо развиты.
Для моей первой попытки использования реальной программы я выбрал код, основанный на статье Daniel Moth за апрель 2012 года. Я не могу заставить его строить. Я всегда получаю ошибку:
C2871 "Параллелизм": пространство имен с таким именем не существует.
Я знаю, что код был впервые написан для Visual Studio 11, но на моей машине были только VS 2008 и VS 2010. Итак, я установил VS 2017 (версия 15.9.4, .Net 4.7.03062). Я начал с пустого проекта C++, но у меня были проблемы с ним. Лучшее, что я мог сделать после того, как проработал все то, что он не распознал, это ошибка:
C3861: идентификатор доступа не найден, строка 2616 в файле amp.h.
Итак, я начал снова, на этот раз с пустым проектом консольного приложения Windows. Опять же, мне пришлось значительно доработать код для перехода с Visual Studio 11 на VS 2017, но в итоге получился код, как показано ниже.
Я пытался как мог найти источник ошибки. Я нацелился как на x64, так и на x86, но это не имело значения. Я закомментировал строку 5 и строки 21 - 27, и код будет собираться и выполняться. IntelliSense не показал никаких проблем ни с идентификаторами, ни с синтаксисом. Фактически, информация при наведении мышки распознала Concurrency
конструкции как таковые. Я намеренно ошибся Concurrency
, но IntelliSense поймал это сразу. Я просмотрел свойства проекта, ориентируясь на настройку, которую нужно было изменить для запуска AMP, но поскольку я даже не был уверен, что искал, я ничего не нашел.
Я пытался найти имя файла, в котором Concurrency
определяется так, чтобы я мог искать свою машину, чтобы увидеть, если она была там, и добавить путь, если он был, но безуспешно. Я даже не мог найти имя файла. Я гуглил и просматривал онлайн-источники и MS Docs, но, как бы я ни сформулировал свои поисковые вопросы, я не нашел ответов.
Ошибка говорит:
Параллелизм не существует
что для меня означает, что он не может его найти, он не на машине, или некоторые настройки сборки не позволяют его использовать. Большинство онлайновых статей о написании кода AMP ничего не говорят о настройках сборки. Разве это не требует ничего отличного от серийно закодированного проекта? Это так же просто, как отсутствующая ссылка? Если так, куда я могу пойти, чтобы найти это? С моим ограниченным опытом я не знаю, что еще попробовать.
Моя машина - Win 7 SP1. Исправление ошибки KB2999226 установлено. Я не установил все VS 2017, так как меня интересуют только C# и C++. Я не смог установить то, что должен был иметь?
Если бы эта проблема была решена раньше, я не смог бы ее найти. Таким образом, любая помощь будет оценена.
1. #include <amp.h>
2. #include "pch.h"
3. #include <iostream>
4. #include <vector>
5. using namespace Concurrency;
6.
7. int main() {
8. const int M = 1024; const int N = 1024; //row, col for vector
9. std::vector<int> vA(M*N); std::vector<int> vB(M*N); //vectors to add
10. std::vector<int> vC(M*N); //vector for result
11.
12. for (int i = 0; i < M; i++) { vA[i] = i; } //populate vectors
13. for (int j = N - 1; j >= 0; j--) { vB[j] = j; }
14.
15. for (int i = 0; i < M; i++) { //serial version of
16. for (int j = 0; j < N; j++) { //matrix addition
17. vC[i*N + j] = vA[i*N + j] + vB[i*N + j]; //using vectors
18. }
19. }
20.
21. extent<2> e(M, N); //uses AMP constructs but no
22. array_view<int, 2> a(e, vA), b(e, vB); //parallel functions invoked
23. array_view<int, 2> c(e, vC);
24. index<2> idx(0, 0);
25. for (idx[0] = 0; idx[0] < e[0]; idx[0]++) {
26. for (idx[1] = 0; idx[1] < e[1]; idx[1]++) {
27. c[idx] = a[idx] + b[idx];
28. }
29. }
30. // C2871 'Concurrency': a namespace with this name does not exist. Line 5
31. // Also C2065, C3861, C2062 for all Concurrency objects Line 21 - Line 27
32. }
33.
1 ответ
С,
#include "amp.h"
#include "pch.h"
#include <iostream>
using namespace concurrency;
Я получил,
C2871 'concurrency': a namespace with this name does not exist
Тем не менее, с,
#include "pch.h"
#include <iostream>
#include "amp.h"
using namespace concurrency;
нет ошибки
Я предлагаю переехать #include "amp.h"
как показано.
Я также использовал оба concurrency
а также Concurrency
, Там не было никакой разницы.
За ошибку C3861: ‘access’ identifier not found, line 2616 in file ‘amp.h’.
В меню выберите Project
затем выберите Properties
,
в Property Pages
окно под C/C++
, Выбрать All Options
затем выберите Conformance mode
,
+ Изменить Yes (/permissive-)
в No
, Выбрать OK
,
Постройте проект и запустите.
По умолчанию параметр /permissive- устанавливается в новых проектах, созданных в Visual Studio 2017 версии 15.5 и более поздних. Это не установлено по умолчанию в более ранних версиях. Когда эта опция установлена, компилятор генерирует диагностические ошибки или предупреждения при обнаружении нестандартных языковых конструкций в вашем коде, включая некоторые распространенные ошибки в коде до C++11.
Более подробную информацию можно найти здесь.
Для меня это говорит о том, что "amp.h"
не соответствует изменениям, внесенным в C++ 15.5. Таким образом, он работал с C++ в VS 2015 14.0 (обновление 3), а затем потерпел неудачу с C++ в VS 2017 15.9.5.