我不知道为什么我的内核函数不起作用。从理论上讲,我的程序应显示a = 14但显示a = 5.
#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
a还是5?
答案 0 :(得分:1)
每当您遇到CUDA程序时遇到问题,第一步应该是对所有cuda API调用和内核调用使用正确的cuda error checking。通过错误检查,此错误(驱动程序问题)将立即显而易见。
可以在cuda标记info tab上找到其他建议。
答案 1 :(得分:-2)
也许你需要把cudaDeviceSynchronize();在AddIntCUDA&lt;&lt;&lt;&lt;&lt; 1&gt;&gt;&gt;(d_a,d_b)之后;
执行AddIntCUDA&lt;&lt;&lt;&lt;&lt; 1&gt;&gt;&gt;(d_a,d_b);如果你没有放入cudaDeviceSynchronize();主机不等待CUDA内核;