2017-03-16 115 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結構定義不提供這樣定義的運算符),除非你提供了一些額外的腳手架或框架。這個額外的腳手架或框架將包含比較代碼,與上面示例中所示的內容相符。

作爲最終評論,通常不建議比較浮點數量的平等。通常建議確定如果兩個量子之間的差異小於某個閾值,則它們是「相等的」。但是,這實際上是一個與你的問題分開的話題,可能你的「握手」用例不適合這種模型,當比較「正確性」的數字/算術結果時,通常會使用這種模型。