parallel_for_each上下文中的数组副本
Array copy in parallel_for_each context
我是AMP C++的新手。如果我在"parallel_for_each"函数中使用"memcpy",一切都会很好,但我知道这不是最佳做法。我尝试使用"copy_to",但它引发了一个异常。下面是一个简化的代码,重点是我遇到的问题。提前谢谢。
typedef std::vector<DWORD> CArrDwData;
class CdataMatrix
{
public:
CdataMatrix(int nChCount) : m_ChCount(nChCount)
{
}
void SetSize(UINT uSize)
{
// MUST be multiple of m_ChCount*DWORD
ASSERT(uSize%sizeof(DWORD) == 0);
m_PackedLength = uSize/sizeof(DWORD);
m_arrChannels.resize(m_ChCount*m_PackedLength);
}
UINT GetChannelPackedLen() const
{
return m_PackedLength;
}
const LPBYTE GetChannelBuffer(UINT uChannel) const
{
CArrDwData::const_pointer cPtr = m_arrChannels.data() + m_PackedLength*uChannel;
return (const LPBYTE)cPtr;
}
public:
CArrDwData m_arrChannels;
protected:
UINT m_ChCount;
UINT m_PackedLength;
};
void CtypDiskHeader::ParalelProcess()
{
const int nJobs = 6;
const int nChannelCount = 3;
UINT uAmount = 250000;
int vch;
CArrDwData arrCompData;
// Check buffers sizes
ASSERT((~uAmount & 0x00000003) == 3); // DWORD aligned
const UINT uInDWSize = uAmount/sizeof(DWORD); // in size give in DWORDs
CdataMatrix arrChData(nJobs);
arrCompData.resize(nJobs*uInDWSize);
vector<int> a(nJobs);
for(vch = 0; vch < nJobs; vch++)
a[vch] = vch;
arrChData.SetSize(uAmount+16); // note: 16 bytes or 4 DWORDs larger than uInDWSize
accelerator_view acc_view = accelerator().default_view;
Concurrency::extent<2> eIn(nJobs, uInDWSize);
Concurrency::extent<2> eOut(nJobs, arrChData.GetChannelPackedLen());
array_view<DWORD, 2> viewOut(eOut, arrChData.m_arrChannels);
array_view<DWORD, 2> viewIn(eIn, arrCompData);
concurrency::parallel_for_each(begin(a), end(a), [&](int vch)
{
vector<DWORD>::pointer ptr = (LPDWORD)viewIn(vch).data();
LPDWORD bufCompIn = (LPDWORD)ptr;
ptr = viewOut(vch).data();
LPDWORD bufExpandedIn = (LPDWORD)ptr;
if(ConditionNotOk())
{
// Copy raw data bufCompIn to bufExpandedIn
// Works fine, but not the best way, I suppose:
memcpy(bufExpandedIn, bufCompIn, uAmount);
// Raises exception:
//viewIn(vch).copy_to(viewOut(vch));
}
else
{
// Some data processing here
}
});
}
我修复了用以下代码替换原始代码的代码:viewIn(vch).copy_to(viewOut(vch;它只复制源范围,这正是我所需要的。但仅编译而不编译受限AMP。
与parallel_for_each
无关,它看起来是array_view::copy_to
的已知错误。请参阅以下帖子:
对并发的好奇::复制和array_view投影交互
您可以使用显式view_as()
来修复此问题。我相信在您的情况下,您的代码应该是这样的。
viewIn(vch).copy_to(viewOut(vch));
// Becomes...
viewIn[vch].view_as<1>(concurrency::extent<1>(uInDWSize)).copy_to(viewOut(vch));
我无法编译您的示例,因此无法验证这一点,但我能够从类似的代码中获得一个异常,并使用view_as()
进行修复。
如果要在C++AMP内核中复制数据,则需要将其作为一系列线程上的赋值操作来执行。以下代码将source
的前500个元素复制到较小的dest
阵列中。
array<int, 1> source(1000);
array<int, 1> dest(500);
parallel_for_each(source.extent, [=, &source, &dest](index<1> idx)
{
if (dest.extent.contains(idx))
dest[idx] = source[idx];
});
相关文章:
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- 复制构造函数生成旧数组的错误副本
- C++全局常量数组:是否保证合并(优化)到一个副本中
- 取消引用指针以创建数组的副本
- 显示 VC++ 中的错误的 Visual C++ 数组副本
- 将动态数组作为副本传递给递归函数 C++
- ubuntu Linux 中的数组副本实际上不起作用
- 我的代码正在制作 2D 数组元素的重复副本.代码中有什么问题?
- 调整 c++ 数组的大小和副本
- 如何在 C++ 函数内创建数组的动态副本
- 数组元素的本地副本
- 错误的数组初始化与赋值副本构造函数初始化
- C++函数从对象数组返回对象的副本.这是默认行为吗?
- 创建数组C++的深层副本
- TCHAR数组的深度副本被截断
- parallel_for_each上下文中的数组副本
- 是否可以使用数组副本复制矢量的一部分
- 获取c++中指向数组的指针的副本
- 问:数组diningRoom包含多少个MAX_ITEMS的副本?
- 选择要在函数中作用的数组,而不必为每个数组的副本指定函数的版本