我是一名业余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.
答案 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"
。
我也同时使用了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之前的代码中的一些常见错误,编译器就会生成诊断错误或警告。
可能会找到更多信息here。
对我来说,这表明"amp.h"
不符合C ++ 15.5所做的更改。因此,它在VS 2015 14.0(Update 3)中与C ++一起使用,然后在VS 2017 15.9.5中与C ++一起失败了。