Cuda 为什么for循环的运行速度不超过1000000

Cuda 为什么for循环的运行速度不超过1000000,cuda,Cuda,我是一个书呆子,遵循一个教程 这是一个非常简单的程序 为什么我的结果是零 我认为我的for循环有问题,因为当我将for循环的值减少到百万时,它工作正常 老师使用了1000万的值,他的程序运行良好,但我看不出我的程序有什么问题,尽管我正在复制每一个和所有内容 请看一看 这是内核 __global__ void AddIntsCUDA(int* a, int* b) { for (int i = 0; i < 10000005; i++) a[0] += b[0]; }

我是一个书呆子,遵循一个教程

这是一个非常简单的程序

为什么我的结果是零

我认为我的for循环有问题,因为当我将for循环的值减少到百万时,它工作正常

老师使用了1000万的值,他的程序运行良好,但我看不出我的程序有什么问题,尽管我正在复制每一个和所有内容

请看一看

这是内核

__global__ void AddIntsCUDA(int* a, int* b)
{
    for (int i = 0; i < 10000005; i++)
        a[0] += b[0];
}
\uuuuu全局\uuuuu无效附加数据(int*a,int*b)
{
对于(int i=0;i<10000005;i++)
a[0]+=b[0];
}
这是主要的

int main()
{
    int a = 0; 
    int b = 1;
    int *d_a, *d_b;

    if (cudaMalloc(&d_a, sizeof(int)) != cudaSuccess)
    {
        cout << "Error" << endl;
    }

    if (cudaMalloc(&d_b, sizeof(int)) != cudaSuccess)
    {
        cout << "Error" << endl;
    }

    if (cudaMemcpy(d_a, &a, sizeof(int), cudaMemcpyHostToDevice) != cudaSuccess)
    {
        cout << "Error" << endl;
    }


    if (cudaMemcpy(d_b, &b, sizeof(int), cudaMemcpyHostToDevice) != cudaSuccess)
    {
        cout << "Error" << endl;
    }

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

    if (cudaMemcpy(&a, d_a, sizeof(int), cudaMemcpyDeviceToHost) != cudaSuccess)
    {
        cout << "Error in back copy" << endl;
        cudaFree(d_a);
        cudaFree(d_b);
        return 0;
    }

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

    cudaFree(d_a);
    cudaFree(d_b);

    cudaDeviceReset();
    system("pause");

    return 0;
}
intmain()
{
int a=0;
int b=1;
int*d_a,*d_b;
如果(cudamaloc(&d_a,sizeof(int))!=cudaSuccess)
{

cout这应该可以正常工作。如果您的CUDA设备也用作图形卡,这意味着它将在内核函数完成之前超时。因此,答案将是错误的

以下是一些提示:

  • 不要在循环内更新全局内存
  • 增加CUDA设备的超时时间,这取决于您的 操作系统,您应该检查这个问题

  • 你的for循环被编码为运行1000000次,然后停止。你还期望什么?你希望它做什么?老师正在运行1000005次的循环,但当我提出我的循环大于10000次时,结果会出错。不要在不理解的情况下复制代码,独自做作业。这很清楚为什么不超过1000.000次。告诉我这次请。我正在寻找很长一段时间的解决方案。我想如果您不想回答我提出的问题,我可能无法帮助您。在这种情况下,是否会产生设备无响应错误?它只会在没有完成循环的情况下杀死内核函数。在[0]中留下一些不完整的值。