我是一名业余 C# 程序员,由于需要 C++ AMP 技术来处理一些繁重的数字运算,因此误入了 C++。因此,我的 C++ 编程技能并没有得到很好的发展。
在我第一次尝试实际程序时,我选择了基于Daniel Moth 2012 年 4 月文章的代码。我无法建造它。我总是得到错误:
C2871 '并发':具有此名称的命名空间不存在。
我知道代码最初是为 Visual Studio 11 编写的,但我的机器上只有 VS 2008 和 VS 2010。所以,我安装了 VS 2017(版本 15.9.4,.Net 4.7.03062)。我从一个空的 C++ 项目开始,但遇到了麻烦。在我完成了它无法识别的所有事情之后,我能做的最好的事情就是一个错误:
C3861:未找到“访问”标识符,文件“amp.h”中的第 2616 行。
所以我又开始了,这次是一个空的 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.