繁体   English   中英

如何使用C ++ AMP并行化以下循环?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM