簡體   English   中英

CUDA內核和printf奇怪的行為。

[英]CUDA kernel and printf strange behaviour.

我編寫了簡單的內核代碼,試圖操縱一維數組元素:

    #include "stdio.h"

__global__ void Loop(double *X, int CellsNum, int VarNum,const double constant1)
{

int idx = threadIdx.x+blockDim.x*blockIdx.x;
int i = (idx+1)*VarNum ;
double exp1,exp2,exp3,exp4 ;

if(idx<CellsNum-2) {

exp1=double(0.5)*(X[i+6+VarNum]+X[i+6])+X[i+10] ;
exp2=double(0.5)*(X[i+8+VarNum]+X[i+8]) ;

if(i==0) {
printf("%e %e",exp1,exp2) ;
}

exp3=X[i+11]-constant1*(exp1*exp2)/X[i+5] ;

exp4=constant1*(X[i+9]*exp1-X[i+9-VarNum]*exp2)/X[i+5] ;

X[i+12]=exp3+exp4;
}
}

extern "C" void cudacalc_(double *a, int* N1, int* N2, double* N3)
{
int Cells_Num = *N1;
int Var_Num = *N2;
double constant1 = *N3;

Loop<<<1,Cells_Num>>>(a,Cells_Num,Var_Num,constant1);

}

但是,如果我注釋這段代碼,那是行不通的:

if(i==0) {
printf("%e %e",exp1,exp2) ;
}

即使變量我總是大於零。 比起我來說,這行代碼會在X數組中生成NaN。 我正在嘗試在Tesla GPU上運行使用-arch sm_20標志編譯的代碼。 也許有人可以幫我解決這個問題?

該內核有機會出現競爭狀況,因為內核代碼既從X讀取又在沒有同步或保護的情況下寫入X

解決此問題的最簡單方法可能是將輸出語句分開以寫入不同的數組:

Xo[i+12]=exp3+exp4;

cuda-memcheck可以幫助檢查內核中的競爭條件。 使用cuda-memcheck --help查找特定的racecheck選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM