我不知道爲什麼我的內核函數不起作用。理論上我的程序應該顯示= 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?
您的代碼適用於我。輸出爲14.檢查所有CUDA調用的返回類型。 – brano 2013-02-26 12:52:29
我意識到,在同一個流內,這不應該是一個問題,但在過去,我看到了奇怪的結果,除非我在內核調用後放置了cudaDeviceSynchronize()。您可能想要至少嘗試一下,看看是否出於某種原因在內核完成之前發生了memcpy。 – lmortenson 2013-02-26 13:32:23
你的代碼完全沒有錯誤檢查。內核很可能沒有執行,因此a的值沒有改變。 – RoBiK 2013-02-26 13:49:07