2017-01-09 246 views
-3

我有一個很奇怪的錯誤。我正在Cuda編寫一個模擬康威生命遊戲的程序。我將二維數組轉換爲設備,並且有一個if-case來檢查狀態的線程。NVIDIA Cuda if語句

if(iam==-1) 
{  //i am on 
    iam=0; 
} 
else if(iam==1) 
{  //i am dying 
    iam=-1; 
} 
else //i am off 
{ 
     if(counter_alive==2)//two neighboors alive 
     { 
      iam=1; //i will be on 
     } 
     // iam = -999; 
} 

當註釋的最後一行沒有任何作用,var「iam」有第一個值。但是,如果我放棄//,它將起作用。當然,如果流的代碼執行else,那麼var「iam」將取值-999。 任何想法?我錯過了什麼? 在此先感謝!

+0

@talonmies:你怎麼知道這個問題與C或C++無關?就目前而言,我寧願懷疑它的確存在,但根本不可能與CUDA有任何關係。 :) – tera

+1

@tera:因爲它只是標籤垃圾郵件,這就是爲什麼。而且我寧願只是悄悄地去掉標籤,而不是讓通常的C或C++憤怒的巨魔之一過來並將其移除並同時啓動火焰戰爭 – talonmies

+0

好的。請注意,無論如何,這都是嘟嘟tong tong的。 @fikos:您確實需要提供[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – tera

回答

1

您不顯示變量iam或counter_alive的初始值。讓我們假設編譯器將其設置爲0.當然,即使編譯器只是將空間設置爲隨機值,該分析也是相同的。

​​

由於初始值是0,那麼這個失敗,並且通過

else if(iam==1) 
{  //i am dying 
    iam=-1; 
} 

滴再次,由於初始值是0,那麼它失敗和滴劑通過。

else //i am off 
{ 
    if(counter_alive==2)//two neighboors alive 
     { 
      iam=1; //i will be on 
     } 
    // iam = -999; 
} 

它在這裏輸入的值爲0.但是,由於counter_alive從未設置,因此它也是0,如果失敗。

因此,iam變量永遠不會從0更改。請注意,由於這兩個臨界值都不會更改,iam將永遠不會從0重置。如果取消註釋最後一行,它將始終明確設置爲-999,並且永遠不會改變。這是因爲你從不測試0或999.如果你將它設爲-1,它會變爲0,然後永遠不會改變,除非你改變其他地方的counter_alive爲2.

請注意,Explanation of CUDA C and C++解釋瞭如何處理循環作爲並行處理。在這種情況下,數組中各個項目的反應可能與您在純C(單流)處理中所期望的不同。

+0

var iam有3個值。 1 -1或0.讓我們忘記其他語句。我檢查了值-1和最後一行(iam = -999)是評論。絕不要先輸入if語句。但如果我將取消註釋iam = -999;它進入第一個如果。我知道這聽起來很奇怪。如果你願意,我可以發佈截圖。我不知道這是否與cuda線程有關。 – fikos

+0

@fikos我們必須看到這個代碼。 IAM定義爲什麼?它是一個整數,一個簡短的,未簽名的?你怎麼知道iam被設置爲-1而不是被第一個if語句拾起?你如何設置counter_alive? – sabbahillel