0

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

1 回答 1

1

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

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

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

如果someExtent始终非零,但您需要传入零长度myArray,那么我建议将长度加一并myArray在计算中简单地考虑这一点。

无论哪种情况,我都认为这可以解决零长度数组问题。如果没有,请提供更多详细信息。

于 2013-11-11T07:30:52.667 回答