2015-12-23 68 views
0

我的一個內核比較了每個值大於標量的double 1D數組。該內核填充比較結果的布爾數組。什麼是TRUE(240)布爾值

生成的布爾向量應該提供TRUE或FALSE項中的每個元素比較結果。

但我發現設備存儲了其他類型的TRUE值,這些值使我的代碼崩潰。我可以找到TRUE(63),TRUE(66),TRUE(240)等。這是什麼?

當標量等於零時,請在兩個不同的時間下載相同陣列的圖像。

https://onedrive.live.com/redir?resid=26B45E0F43F4667B!12766&authkey=!APVysjd1WK1nDhE&ithint=folder%2c

1D陣列包含100個元素,並且只有第一元素等於1,其餘爲等於零。預期的結果當然是: {TRUE,FALSE,FALSE,FALSE,... FALSE}

我發現了另一個問題,提示使用32位整數(「理想情況下,你應該瞄準使用32位型「),但我不知道如何做到這一點:

Boolean operations on CUDA

這是我的內核:

__global__ void _vecCmpGreat(bool *output, double *input1, double input2) { 
    unsigned int i = blockDim.x * blockIdx.x + threadIdx.x; 
    if (i < samples) 
     output[i] = input1[i] > input2; 
} 

我的代碼,計算比較結果的部分是以下。當發現從「FALSE」到「TRUE」的布爾數組時,它應該推回到std :: vector結果中。

unsigned int j; 
for (unsigned int i = 0; i < samples - 1; i++) { 
    j = samples - i - 1; 
    if (r[samples - 1]) { 
     result.push_back(samples - i - 1); 
     break; 
    } 
    else { 
     if (r[j] == false && r[j - 1] == true) { 
     result.push_back(j); 
     break; 
    } 
} 

任何意見將不勝感激。

回答

0

你的問題是這樣的一行:

 if (r[j] == false && r[j - 1] == true) 

你需要的是:

 if (!r[j] && r[j - 1]) 

(我覺得這更容易爲已讀:

 if (r[j - 1] && !r[j]) 

出於某種原因)

Compari在基於C的語言中針對falsetrue的ng布爾值幾乎總是危險的。如果r被聲明爲bool類型,那麼它應該可以工作,否則在測試時任何非零值都將被視爲「真」,但只有1將被比較等於true。在其實false比較不會有這個問題 - 但一旦你比較一個布爾文字,你可以很容易忘記和比較其他。拒絕吧。

+0

非常感謝#(Martin Bonner)。解決方案非常簡單。 – Vitrion

0

我懷疑他們只是那些整數。在C++中,0 == false and true = !false

因此的0所有值都false,以及任何其他的值是true,如6366,和240。這些可能是你正在發現的。

嘗試將它們作爲整數進行類型化或將它們與已知整數進行比較,以查看它們究竟是什麼。

聲明:我不熟悉CUDA。

+0

另外。非常感謝你 – Vitrion