2013-02-26 30 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上找到。