“并发”:具有该名称的名称空间不存在

时间:2019-01-21 21:55:09

标签: c++-amp concurrency-runtime

我是一名业余C#程序员,由于需要C ++ AMP技术来执行一些繁重的数字运算,因此他们迷上了C ++。因此,我的C ++编程技能不是很发达。

第一次尝试实际程序时,我选择了基于Daniel Moth's April 2012 article的代码。我无法建立它。我总是会收到错误:

  

C2871“并发”:具有该名称的名称空间不存在。

我知道代码最初是为Visual Studio 11编写的,但是我的机器上只有VS 2008和VS 2010。因此,我安装了VS 2017(版本15.9.4,.Net 4.7.03062)。我从一个空的C ++项目开始,但是遇到了麻烦。在完成所有它不认识的事情之后,我能做的最好的就是一个错误:

  

C3861:找不到“访问”标识符,文件“ amp.h”中的第2616行。

因此,我再次开始,这一次是使用一个空的Windows Console Application项目。同样,我不得不对代码进行大量调整才能从Visual Studio 11迁移到VS 2017,但最终得到如下所示的代码。

我尽我所能查找错误的根源。我同时针对x64和x86,但没有区别。我注释掉了第5行和第21 – 27行,代码将生成并执行。 IntelliSense没有出现任何问题,无论是标识符还是语法。实际上,鼠标悬停信息可以识别Concurrency构造。我故意拼写错误的Concurrency,但是IntelliSense很快就抓住了它。我查看了项目属性,着眼于需要更改以运行AMP的设置,但是由于我什至不确定自己在寻找什么,所以我什么也没找到。

我试图找到在其中定义了Concurrency的文件的名称,以便可以搜索我的机器以查看是否存在该文件,如果存在则添加路径,但是没有成功。我什至找不到文件名。我搜索并浏览了在线资源和MS Docs,但是无论我如何用措辞表达搜索问题,我都找不到任何答案。

错误提示:

  

并发不存在

在我看来这意味着找不到它,不在机器上,或者某些构建设置阻止了它的使用。关于编写AMP代码的大多数在线文章都没有提及构建设置。它不需要与序列编码的项目不同的东西吗?它像缺少参考一样简单吗?如果是这样,我在哪里可以找到它?以我有限的经验,我不知道还能尝试什么。

我的机器是Win 7 SP1机器。已安装 KB2999226 错误修复程序。由于我只对C#和C ++感兴趣,所以我没有安装VS 2017的全部。我没有安装应有的东西吗?

如果以前已解决此问题,则找不到。因此,我们将不胜感激。

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 :(得分:0)

使用

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

我也同时使用了concurrencyConcurrency。没有区别。


对于错误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之前的代码中的一些常见错误,编译器就会生成诊断错误或警告。

  

可能会找到更多信息here

对我来说,这表明"amp.h"不符合C ++ 15.5所做的更改。因此,它在VS 2015 14.0(Update 3)中与C ++一起使用,然后在VS 2017 15.9.5中与C ++一起失败了。