2011-11-27 71 views
0

我們有含有以下格式的非結構化四面體網格文件:CUDA內核有限元裝配

element-ID nod1 nod2 nod3 nod4 


    1   452 3434 322 9000 

    2   2322 837 6673 2323 

    . 
    . 
    . 

300000 

我們劃分的每個2048分區大小以上的網格。 對於每個分區大小2048包含唯一的nod1 nod2 nod3 nod4值,我們在不同的起始索引處傳遞1個塊和512個線程。

在CUDA文件,我們有

__global__ void calc(double d_ax,int *nod1,int *node2,int *nod3,int *nod4,int start,int size) 
{ 
    int n1,n2,n3,n4;  
    int i = blockIdx.x * blockDim.x + threadIdx.x + start; 


    if (i < size) 
    { 

     n1=nod1[i]; 
     n2=nod2[i]; 
     n3=nod3[i]; 
     n4=nod4[i]; 

     ax[n1] += some code; 
     ax[n2] += some code; 
     ax[n3] += some code; 
     ax[n4] += some code; 
    } 
} 

我們所說的內核

calc<<<1,512>>>(d_ax,....,0,512); 
calc<<<1,512>>>(d_ax,....,512,512); 
calc<<<1,512>>>(d_ax,....,1024,512); 
calc<<<1,512>>>(d_ax,....1536,512); 

上面的代碼工作得很好,但問題是,我們使用一個以上的塊得到不同的結果一次。例如:

calc<<<2,512>>>(d_ax,....,0,1024); 
calc<<<2,512>>>(d_ax,....,1024,1024); 

任何人都可以幫助我嗎?

+0

你能編輯問題來解釋*爲什麼*你不能多用一個塊嗎?雖然你在這可以修復你的問題中的所有*代碼 - 它是如此不完整和充滿錯誤,你可能還沒有發佈它,這對任何試圖回答你的問題的人都沒有幫助 – talonmies

+0

我有投票決定讓這個問題關閉太過本地化。看起來您的問題是由於基本的編程錯誤和/或對CUDA的基本知識完全缺乏瞭解。這類問題不屬於計算器。 – talonmies

回答

1

我不知道你如何指望任何人告訴你什麼可能是錯誤的,當你已經發布的代碼是不完整的和不可編譯的,但如果在單塊情況下,你真的是調用內核你已經發布,這是應該發生的事情:

calc<<<1,512>>>(d_ax,....,0,512); // process first 512 elements 
calc<<<1,512>>>(d_ax,....,512,512); // start >= 512, size == 512, does nothing 
calc<<<1,512>>>(d_ax,....,1024,512); // start >= 1024, size == 512, does nothing 
calc<<<1,512>>>(d_ax,....1536,512); // start >= 1536, size == 512, does nothing 

所以無論是否使用多塊運行時,你的代碼可能會被打破,你的結果爲單塊的情況下很可能是錯誤的,你的問題的整點可能是不相干結果。

如果您想要更好的答案,請編輯您的問題,以便它包含問題的完整說明以及實際可以編譯的簡潔完整的代碼。否則,這與任何人可以從您提供的信息中猜測的一樣多。

+0

大小是要處理的元素的數量 –

+0

@Krakesh:據我所知,根據您發佈的代碼,只有在blockIdx.x * blockDim.x + threadIdx時才執行求和計算。x + start talonmies

0

對於2048每個分區大小包含唯一NOD1 NOD2 nod3 nod4 值

但在兩個分隔設置相同的節點索引可以出現? 如果在兩個不同的塊你有

塊1: ax[1234]=do something

塊2: ax[1234]=do something else

它的氣味作爲一個種族條件。你永遠不知道哪兩個塊中的哪一個寫入會更快......