2017-03-16 63 views
-2

我有一些C++/CUDA代码,我想比较两个不等的float2值。从本质上讲,我需要沿着线的东西:比较float2s的平等/不平等

float2 cond = {1,0} 
float2 *array = ... 

while (array[0] != cond) 
{ 
    Code... 
} 

我的代码的目的是实现共享内存一对夫妇进程之间一些基本的握手。我希望数组中的某个值作为就绪标志,所以我想监视它的值。我意识到还有其他方法可以在进程之间实现握手,但我需要实现这一点,而不必对已存在的代码进行很多更改。

注意:正如其他人所指出的,在浮动块之间进行直接比较绝不是一个好主意。但是,就我而言,没有任何操作会应用于有问题的元素,所以不应该有任何问题。在未来,我一定会努力寻找更好的解决方案,但在目前的限制下,这需要足够的。

+1

使用浮点值对我来说似乎是一个特别糟糕的主意。 – talonmies

+0

我明白这一点。任何操作都不会应用于要比较的任何元素,所以它不应该是一个问题。发生的一切是要么将它设置为{1,0}或{0,0}。我知道有无数更好的选择,但我现在正在受到不幸的限制。 – Kevin

回答

3

像这样的东西应该工作:

float2 cond; 
cond.x = 1; cond.y = 0; 
float2 *array = (float2 *)malloc(array_len*sizeof(float2)); 
// initialize array values, for example: 
array[0].x = 0; 
array[0].y = 0; 

while ((array[0].x != cond.x) || (array[0].y != cond.y)) 
{ 
    Some code... 
} 

我不认为这真的有什么关系CUDA,但它会以类似的方式工作,任一主机代码或CUDA设备代码。

也许您在问是否可以通过一些直接比较来完成,例如,

array[0] != cond 

如您所示。它不能(因为float2结构定义不提供这样定义的运算符),除非你提供了一些额外的脚手架或框架。这个额外的脚手架或框架将包含比较代码,与上面示例中所示的内容相符。

作为最终评论,通常不建议比较浮点数量的平等。通常建议确定如果两个量子之间的差异小于某个阈值,则它们是“相等的”。但是,这实际上是一个与你的问题分开的话题,可能你的“握手”用例不适合这种模型,当比较“正确性”的数字/算术结果时,通常会使用这种模型。