如果我需要一个零大小的数组,我该怎么办?

时间:2013-11-09 09:37:20

标签: c++-amp

假设我有一个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!
}

1 个答案:

答案 0 :(得分:1)

简短的回答是你不能有一个零大小的数组。对于任何一个级别,你也不能有一个长度为零的范围。无论好坏,这就是它的方式。 C ++ AMP假定传递给它的任何工作都是真正的工作。请记住,在CPU上,没有开头可以获得零长度循环或零长度数组。在GPU上可能不是这种情况,在加速器上声明阵列并通过DMA缓冲区将内核传递给GPU仍然存在潜在的开销。 DirectX 11中可能存在潜在的限制(我没有时间去看)。

在这种情况下(除非我误解了问题)工作正在进行中,但是一些输入数据(myArray)可能是零长度,但someExtent不为零。

如果事实上someExtent也是零,那么最简单的解决方案就是将一个调用parallel_for_each的代码包装在条件语句中,该条件语句完全跳过调用零值。

如果someExtent始终为非零,但您需要传入零长度myArray,那么我建议在myArray的长度上添加一个,并在你的计算。

在任何一种情况下,我认为这适用于零长度数组问题。如果没有,请提供更多详细信息。