gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:33 24 4
gpt4 key购买 nike

我在 C++ 中有以下循环

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

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

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

enter image description here

并用newarray[0] = value[0] << (unsigned int)(0 << 1 )填充一个新数组, newarray[1] = value[1] << (unsigned int)(1 << 1 )等。然后我将在树结构中并行对数组中的值进行或运算(见图)。

我曾尝试将这个想法放入一些简单的 C++ amp 代码中,但我没有成功,因此我们将不胜感激。

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

最佳答案

以下代码是我认为您需要的部分代码。这段代码会将一些元素作为输入并在 CPU 上准备 vector ,然后在 GPU 上并行执行位移操作。然后我将 av[elements] 设置回 0,因为我正在使用该元素来存储您的最终结果。这很粗糙,但是 AMP 对于可以在 GPU 上处理的数据类型有很大的限制,所以我只是使用现有数组的一个额外元素。位移完成后,我为按位 OR 函数分别执行另一个并行操作。这也发生在 GPU 上,但不太令人满意,因为每个操作都是对数组的任何给定元素与 av[elements] 元素进行 OR 运算,因此这会造成瓶颈。您的树结构将使这部分运行得更快,但我无法弄清楚如何轻松地完成该部分。实际上,这个程序可以在一台相当老旧的计算机上几秒钟内处理 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];
}

关于c++ - 我如何使用 C++ AMP 并行化以下循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13789152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com