2013-02-26 62 views
0

我不知道爲什麼我的內核函數不起作用。理論上我的程序應該顯示= 14,但它顯示= 5內核函數和cudaMemcpy

#include <iostream> 
#include <cuda.h> 
#include <cuda_runtime.h> 

using namespace std; 

__global__ void AddIntCUDA(int* a, int* b) 
{ 
    a[0] += b[0]; 
} 

int main() 
{ 
    int a = 5; 
    int b = 9; 
    int *d_a ; 
    int *d_b ; 

    cudaMalloc(&d_a, sizeof(int)); 
    cudaMalloc(&d_b, sizeof(int)); 

    cudaMemcpy(d_a, &a, sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(d_b, &b, sizeof(int), cudaMemcpyHostToDevice); 

    AddIntCUDA<<<1, 1>>>(d_a, d_b); 

    cudaMemcpy(&a, d_a, sizeof(int), cudaMemcpyDeviceToHost); 

    cout<<"The answer is a = "<<a<<endl; 

    cudaFree(d_a); 
    cudaFree(d_b); 

    return 0; 
} 

此外,我不明白爲什麼,如果我有:

cudaMemcpy(d_b, &b, sizeof(int), cudaMemcpyHostToDevice); //d_b = 9 on device 
cudaMemcpy(&a, d_b, sizeof(int), cudaMemcpyDeviceToHost); //a = 9 on host 

一個仍然是5?

+1

您的代碼適用於我。輸出爲14.檢查所有CUDA調用的返回類型。 – brano 2013-02-26 12:52:29

+0

我意識到,在同一個流內,這不應該是一個問題,但在過去,我看到了奇怪的結果,除非我在內核調用後放置了cudaDeviceSynchronize()。您可能想要至少嘗試一下,看看是否出於某種原因在內核完成之前發生了memcpy。 – lmortenson 2013-02-26 13:32:23

+3

你的代碼完全沒有錯誤檢查。內核很可能沒有執行,因此a的值沒有改變。 – RoBiK 2013-02-26 13:49:07

回答

-2

也許你需要把cudaDeviceSynchronize(); AddIntCUDA後< < < 1,1 >>>(d_a,d_b);

執行AddIntCUDA時< < < 1,1 >>>(d_a,d_b);如果您不放置cudaDeviceSynchronize(),主機不會等待CUDA內核。

+0

不,cudaMemcpy呼叫是阻止呼叫。不需要同步。 – talonmies 2013-02-26 17:47:09

+0

考慮檢查cudaMemcpy,cudaMemcpyAsync和cudaDeviceSynchronize之間的區別 – 2016-11-10 12:09:15

1

每當您遇到CUDA程序問題時,第一步應該是在所有cuda API調用和內核調用上使用正確的cuda error checking。通過錯誤檢查,此錯誤(驅動程序問題)將立即顯而易見。

其他建議可以在cuda標籤info tab上找到。