[英]How could I parallelize the following loop USING C++ AMP?
我在c ++中有以下循环
dword result = 0;
for ( int i = 0; i < 16; i++ ) {
result |= ( value[i] << (unsigned int)( i << 1 ) );
}
我想在放大器中对其进行并行化。 我知道它的速度可能会比上面的实际非并行版本慢,但我想这样做是为了了解有关AMP的更多信息。
我的想法是并行遍历值数组:
并用newarray[0] = value[0] << (unsigned int)(0 << 1 )
, newarray[1] = value[1] << (unsigned int)(1 << 1 )
填充新数组,等。然后,我将以树结构并行处理数组中的值(参见图片)。
我试图将这个想法放入一些简单的c ++ amp代码中,但是我没有成功,所以我们将不胜感激。
感谢您对此事的考虑,我期待得到答复。
以下代码是我认为您需要的一部分。 该代码将大量元素作为输入,并将向量准备在CPU上,然后在GPU上并行执行位移位操作。 然后将av [elements]设置为0,因为我正在使用该元素存储您的最终结果。 这很粗糙,但是AMP对可以在GPU上处理的数据类型有严格的限制,因此我只使用现有数组的一个额外元素。 移位完成后,我将对每个按位“或”函数进行另一个并行处理。 这也发生在GPU上,但是由于每个操作都将数组的任何给定元素与av [elements]元素进行“或”运算,因此不太令人满意,这会造成瓶颈。 您的树结构将使该部分的运行速度更快,但是我无法弄清楚如何轻松地执行该部分。 实际上,此程序可以在一台相当老的计算机上在几秒钟内处理1亿个元素。 如有任何违反最佳做法的行为,请提前道歉; 我也是新手。 代码如下:
#include <conio.h>
#include <amp.h>
#include <iostream>
using namespace concurrency;
using namespace std;
unsigned int doParallel(unsigned int);
unsigned int elements;
void main()
{
int ch=NULL;
cout<<"\nHow many elements to populate: ";
cin>>elements;
cout<<"The result is: "<<doParallel(elements);
cout<<"\nPress 'X' to exit.";
do
{
ch=_getch();
} while (ch!='X' && ch!='x');
exit(0);
}
unsigned int doParallel(unsigned int elements)
{
vector<unsigned int> v(elements+1);
for (unsigned int i = 0; i<elements+1;i++)
{
v[i]=i;
}
array_view<unsigned int,1> av(elements+1,v);
parallel_for_each(av.extent,[=](index<1> idx)
restrict(amp)
{
av[idx] = static_cast<unsigned int>(av[idx])<<1;
});
av[elements]=0;
parallel_for_each(av.extent,[=](index<1> idx)
restrict(amp)
{
av[elements] |= static_cast<unsigned int>(av[idx]);
});
return av[elements];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.