我有以下问题:
我有一个做了非常基本的操作的代码。 我传递一个指向并发::的array_view因为我想存储值早些时候,以避免在使用多线程功能的瓶颈。 问题是下面的结构不会编译:
parallel_for_each((*pixels).extent, [=](concurrency::index<2> idx) restrict(amp)
{
int row=idx[0];
int col=idx[1];
(*pixels)(row, col) = (*pixels)(row, col) * (*taps)(row, col); //this is the problematic place
});
有谁知道如何解决这个情况? 我真的需要运行的方法所以这是不喜欢这样,因为我不能对复制的RAM和加速器的内存之间的数据花费时间的唯一方法之前准备数据。
//编辑:
解决与头文件的一些问题之后,我留下了以下问题:
parallel_for_each((*pixels).extent, [=](concurrency::index<2> idx) restrict(amp)
{
int row=idx[0];
int col=idx[1];
});
上面的代码不工作(它给除外)。 有没有准备数据更早因此,例如类的构造函数可以处理复制它只是一个时间什么办法? 我真的需要有一个指针在我的头文件中的array_view并在构造函数初始化它,如下所示:
在cci_subset.h:
concurrency::array_view<float, 2> *pixels, *taps;
而在subset.cpp:
concurrency::array_view<float, 2> pixels(4, 4, pixel_array);
...
concurrency::array_view<float, 2> taps(4, 4, myTap4Kernel_array);
//编辑2:
我发现,对于parallel_for_each的参数可以通过数值来唯一通过。 这就是为什么我仍然在寻找一种方式来intializing类或传递一些参数(即图像数据)到上课的时候从值CPU拷贝到GPU。
你的C ++ AMP问题
C ++ AMP支持在GPU上引用数据的两个核心数据类型
数组表示加速器数据。 您可以构建它,在一个单一的步骤有数据填充或构建它,后来用数据填充它。 在这两种情况下,经过一番计算,已对其执行的,你几乎肯定会的结果从一个数组复制回CPU,这样就可以在应用程序的其它部分使用它们。
你可以只使用数组肯定写有用的应用程序,但C ++ AMP还提供的array_view,它支持的功能,往往使其比直接使用数组更加方便。 对于一个array_view看起来像一个阵列加速器,但它可以节省你安排将数据复制到和从加速器的麻烦。
一个的array_view和阵列之间的关系是一定程度上(但不是精确地)那样的参考和对象之间它是指。 像的参考,在创建时阵列的观点必须初始化。 还可以作为与参考,改变的array_view变化(最终)它是从创建的数据。 然而,反之则不然:改变从其中的array_view创建可能不会自动更改的array_view中的数据,所以你应该接近这样的操作要小心。
来自: C ++ AMP:加速大规模并行
我不认为你的使用pixels
为每本身的问题。 你不能在全球使用C ++ AMP拉姆达内范围的变量。 有没有办法解决这个。 在C ++代码AMP与不同的存储器空间中的装置上执行。
但是,您可以初始化array
或array_view
更早对象在一个单独的方法或构造函数,然后将它们传递给所有的工作的功能。 下面的代码做东西沿着这些路线。 m_frames
是一个指针数组,以(C ++ AMP) array
被声明为类的PARE然后在初始化的对象ConfigureFrameBuffers
。
注意,它使用STL智能指针,这是我会强烈建议在原始指针。
class FrameProcessorAmpBase
{
private:
std::shared_ptr<array<float, 2> m_frame;
public:
FrameProcessorAmpBase()
{
}
void ConfigureFrameBuffers(int width, int height)
{
m_frame = std::make_shared<array<float, 2>>(height, width));
}
您的最小/最大头的问题
这可能是因为你是包括WINDEF.H,或者一些需要和它有关联。 这是一个已知的问题混合STL和Windows头时。 “修复”的方式是定义NOMINMAX
在您的文件的顶部之前的任何其他包括,然后使用通过STL或AMP声明的最小值/最大值的函数(也限定最小/最大用于restrict(amp)
的lambda) 。
#define NOMINMAX
如果你正在使用GDI你就会有问题,有太多,因为它需要Windows MIN / MAX宏。
我在这包含以下的包装头包GIDPlus.h:
#pragma once
#define NOMINMAX
#include <algorithm>
#ifndef max
#define min std::min
#endif
#ifndef min
#define max std::max
#endif
#include <gdiplus.h>
#undef max
#undef min