C++ AMP 初试

Posted by Ada on October 21, 2018

C++ AMP 初试

这两天想做并行加速,之前用cuda,但是和自己依赖的第三方库各种冲突。现转一下C++ AMP.

其它常用的并行加速编程框架:

  • CUDA : 做显卡的大厂Nvidia 提出的异步并行编程框架。不过就只能用在Nvidia 显卡上

  • OpenCL :是一个开放标准,相比于较为封闭的CUDA. 并不限于特定的显卡厂商。

    来看一段 C++ AMP的入门级代码。功能是对num数组的每个元素加1.

#include <set>
#include <map>
#include <amp.h> 
#include <iostream> 
using namespace concurrency;

int main(int argc, char * argv[])
{
	int num[5] = {1,2,3,4,5 };

	array_view<int> add(5, num);
	parallel_for_each(add.extent, [=](index<1> idx) restrict(amp)
	{
		add[idx] += 1;
	});

	for (unsigned int i = 0; i <5; i++)
	{
		std::cout << (add[i]) << std::endl;
	}
}

上手C++ AMP

就像那个古老的笑话如何把大象装冰箱一样:

使用C++ AMP一般就是三步走:

  1. 创建array_view对象以存储待计算的数据。
  2. 调用parallel_for_each函数进行并行计算。
  3. 通过array_view对象访问计算结果。

而显存的分配和释放、GPU线程的规划和管理,C++ AMP内部会进行处理。

在调试这段代码时。遇到一个错误:

发现我的代码里有#defined max

且我在引用一些文件头之前定义了windows.h

解决方案:

在你的#include之前使用#define NOMINMAX

或者在引用那些头文件之前使用#undef max。

相对来说,比cuda似乎更容易理解一些。


本站总访问量: