2014-10-06 45 views
1

我開始學習CUDA。我編寫了計算階乘的程序。代碼正在工作,但是當我計算階乘更多我得到錯誤的價值。爲什麼CUDA獲得無效價值?如何解決這個問題? 這是我的代碼。Cuda因子值無效

#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 
#include <stdio.h> 
#include <conio.h> 
#define CUPRINTF cuPrintf 

__device__ int silnia(int n) 
{ 
    if (n<2) 
     return 1; //silnia z 0 i 1 wynosi 1 
    return n*silnia(n - 1); 
} 
__global__ void kernel(int *a) 
{ 
    *a = silnia(15); 
} 

int main() 
{ 
    cudaEvent_t start, stop; 
    float elapsedTime; 
    cudaEventCreate(&start); 
    cudaEventRecord(start, 0); 
    int *dev_a,a; 
    cudaEventRecord(start); 
    cudaMalloc((void**)&dev_a, sizeof(int)); 
    kernel << <1, 1 >> >(dev_a); 
    cudaMemcpy(&a, dev_a, sizeof(int), cudaMemcpyDeviceToHost); 
    cudaEventCreate(&stop); 
    cudaEventRecord(stop, 0); 
    cudaEventSynchronize(stop); 
    cudaEventElapsedTime(&elapsedTime, start, stop); 
    printf("Elapsed time : %f ms\n", elapsedTime); 
    printf("%d", a); 
    getch(); 
    return 0; 
} 

Thx尋求幫助。

+4

也許是因爲13!不適合32位整數。 – Mysticial 2014-10-06 22:30:54

回答

4

12因子是479001600它適合於一個int變量。

13因子是6227020800它不適合int變量。

如果您將int更改爲unsigned long long(無處不在,包括您的printf格式說明符),您將獲得更多範圍,但最終會超出範圍。

+0

這可以在cuda中使用64 int嗎? – seti 2014-10-06 22:38:42

+0

是的,它可能與CUDA。 – 2014-10-06 22:40:53

+0

什麼是CPU上最好的計算時間運行應用程序? t1 = clock(); \t cout <<「n!=」<< silnia(21)<< endl; \t t2 = clock(); \t float diff((float)t2 - (float)t1);這個代碼總是說一個,但在GPU上我老實說0.3毫秒 – seti 2014-10-06 22:58:09

1

只因爲有「溢出」。如果繼續使用「int」,則無法解決問題;)