【问题标题】:How could I parallelize the following loop USING C++ AMP?如何使用 C++ AMP 并行化以下循环?
【发布时间】:2012-12-09 16:12:34
【问题描述】:

我在 c++ 中有以下循环

dword result = 0;
for ( int i = 0; i < 16; i++ ) {
    result |= ( value[i] << (unsigned int)( i << 1 ) );
}

我想在 amp 中并行化它。我知道它可能会比上面的实际非并行版本慢,但我想这样做是为了了解更多关于 AMP 的知识。

我的想法是并行遍历值数组:

并用newarray[0] = value[0] &lt;&lt; (unsigned int)(0 &lt;&lt; 1 )newarray[1] = value[1] &lt;&lt; (unsigned int)(1 &lt;&lt; 1 ) 等填充一个新数组。然后我将在树结构中并行地 OR 数组中的值(见图)。

我试图将这个想法放在一些简单的 c++ amp 代码中,但我没有成功,所以任何帮助都将不胜感激。

感谢您对此事的考虑,期待回复。

【问题讨论】:

  • 这是一个想法。生成 16 个执行 result |= ( value[i] &lt;&lt; (unsigned int)( i &lt;&lt; 1 ) ); 的线程,其中 i 是线程构造函数中传递的值。同时使用mutexes 锁定result。这应该适用于 c++11 的thread。我不知道什么是 AMP,所以无能为力:)
  • 另一个想法:展开循环以帮助编译器?

标签: c++


【解决方案1】:

以下代码是我认为您需要的一部分。此代码将许多元素作为输入并在 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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2022-08-06
    • 2012-01-31
    • 2023-04-11
    相关资源
    最近更新 更多