«Параллелизм»: пространство имен с таким именем не существует - PullRequest
0 голосов
/ 22 января 2019

Я - программист-любитель C #, который забрел на C ++ из-за необходимости в технологии C ++ AMP для некоторого сложного перебора чисел. Следовательно, мои навыки программирования на C ++ не очень хорошо развиты.

Для моей первой попытки использования реальной программы я выбрал код, основанный на статье Даниэля Мота за апрель 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 Ответ

0 голосов
/ 22 января 2019

С

#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.

...