假设我有一个Concurrency::array
,其大小我只在运行时知道,并且该大小可能为零:
using namespace Conurrency;
array<int> myArray (datasource); // can't do this if datasource is zero-sized!
parallel_for_each(someExtent,[&](index<1> idx) restrict(amp)
{
// if the size of myArray is 0, I won't use it!
}
在主持人身上,这个问题很简单;你只需要声明一个零大小的向量,任何基于范围的循环都会忽略它。在C ++ AMP中,你必须为每个可能为null大小的数组设计一个单独的内核函数......当然有一种更好的方法,为什么我们不能首先只有零大小的数组呢?
程序员如何避免这类问题?
我目前通过以下方式避免这种情况,其中我并不自豪:
using namespace Conurrency;
if (datasource.size() == 0) datasource.push_back(0); // assuming datasource is a vector
array<int> myArray (datasource); // can't do this if datasource is zero-sized!
parallel_for_each(someExtent,[&](index<1> idx) restrict(amp)
{
// if the size of myArray is 0, I won't use it!
}
答案 0 :(得分:1)
简短的回答是你不能有一个零大小的数组。对于任何一个级别,你也不能有一个长度为零的范围。无论好坏,这就是它的方式。 C ++ AMP假定传递给它的任何工作都是真正的工作。请记住,在CPU上,没有开头可以获得零长度循环或零长度数组。在GPU上可能不是这种情况,在加速器上声明阵列并通过DMA缓冲区将内核传递给GPU仍然存在潜在的开销。 DirectX 11中可能存在潜在的限制(我没有时间去看)。
在这种情况下(除非我误解了问题)工作正在进行中,但是一些输入数据(myArray
)可能是零长度,但someExtent
不为零。
如果事实上someExtent
也是零,那么最简单的解决方案就是将一个调用parallel_for_each
的代码包装在条件语句中,该条件语句完全跳过调用零值。
如果someExtent
始终为非零,但您需要传入零长度myArray
,那么我建议在myArray
的长度上添加一个,并在你的计算。
在任何一种情况下,我认为这适用于零长度数组问题。如果没有,请提供更多详细信息。