,當我在CUDA計算,這是真的,但是當我使用更大的數量來計算,我必須設置TdrLevel爲
this link 。但是在設置了tdrlevel之後,我得到了一個錯誤的結果。 (-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080 -431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080-431602080)錯誤的結果時,在Win7 64位設置tdrlevel CUDA
我不知道在哪裏的問題。我的塊數爲512,每個塊的線程數爲1024。我希望找到我的意思。
that's my program code for fibunatchi program it work without tdrlevel but have above result by tdrlevel :
#include <stdio.h>
#include <cuda.h>
#include <dos.h>
__global__ void fibunat_array(float *a,int N)
{
for (int x=0; x< N; x += 1)
{
a[x]=0;
}
a[0]=1;a[1]=1;
for (int i=0; i< N; i += 1)
{
a[i+2]=a[i]+a[i+1];
}
}
int main(void)
{
time_t start,end;
double dif;
time (&start);
float *a_h,*a_d;
const int N = 100;
size_t size = N * sizeof(float);
a_h = (float *)malloc(size);
cudaMalloc((void **)&a_d, size);
cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
int block_size = 9<<1;
int n_blocks = (N+ block_size-1) /block_size;
square_array <<< n_blocks , block_size >>> (a_d, N);
cudaMemcpy(a_h, a_d, sizeof(float) * N, cudaMemcpyDeviceToHost);
for (int i = 0; i<N/3+10 ; i++)
printf("%d ",(int)a_h[i]);
free(a_h);
cudaFree(a_d);
time (&end);
dif=difftime(end,start);
printf ("\n\n");
printf ("total time for this calculate is : %d second\n\n",(int)dif);
}
也許tdr禁用不起作用。如果您的顯示屏凍結,然後在運行cuda代碼時重新繪製自己,則tdr可能會觸發並且GPU正在重置。如果tdr似乎被正確禁用,那麼您的代碼中可能會有一個錯誤,它只會以較大的數據集顯示自身。 –
感謝您的回答。我應該解釋一下,我在此路徑中添加零值TdrLevel:HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ GraphicsDrivers。如果不製作這個文件,屏幕凍結和黑色片刻。但經過很多搜索後,我發現我應該在上面的路徑中添加TdrLevel。添加TdrLevel後,屏幕不凍結,黑色,但有錯誤的結果,我在第一評論解釋。我的代碼是sum數組中的簡單代碼。我希望你有這個問題的解決方案。謝謝 –
那麼也許你的簡單的數組求和程序有一個錯誤,只顯示爲更大的值本身。它可能與tdr無關。你可能會發布你的代碼。下面是一個剛剛發佈在數組總和程序上的人的示例(http://stackoverflow.com/questions/12659988/cuda-memory-limit-vector-summation),該程序不適用於較大的數據集。 –