2013-11-09 65 views
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中,你必须为每个数组设计一个单独的内核函数,这个函数可能是空值......当然,还有更好的方法,为什么我们不能只有零大小的数组呢?

程序员如何避免这类问题?

我目前避免它通过执行以下,其中我不要骄傲,

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

简短的回答是,你不能有一个零大小的数组。你的任何级别的长度都不为零。无论更好还是更糟,这只是它的方式。 C++ AMP假定传递给它的任何工作都是真实的工作。记住在CPU上,零长度循环或零长度数组没有开销。在GPU上可能并非如此,在加速器上声明阵列并通过DMA缓冲区将内核传递给GPU仍然存在潜在的开销。 DirectX 11中也可能存在潜在的限制(我没有时间看)。

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

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

如果someExtent总是非零,但你需要传递一个零长度myArray然后我建议加一个长度为myArray,并简单地说明你的计算。

在这两种情况下,我认为这适用于零长度阵列问题。如果没有,请提供更多细节。

+0

是的,这就是我正在做的事情,并不为此感到自豪,但如果这是需要做的事情,我会做;我真的不喜欢讨论人为的语言限制... – arman

相关问题