Cuda GPU编译,我认为它没有使用GPU

问题描述

我尝试学习CUDA。它是如此相似。 我尝试在GPU中运行一些代码。 但是我认为这不是很快,我认为这与我的代码有关。 我猜只有我的 __global__ void func(ull* num1,ull* num2,ull* sum)在GPU上工作。 这就是我要的。但这不是很快。我该怎么办。

typedef uint64_t ull;

#define E1 1
#define E2 5000000000000000

__global__ void func(ull* num1,ull* sum)
{
    for (ull i = *num1; i <= *num2; i++)
    {
        sum[0] += i;
    }
}

int main()
{
    ull n1 = E1;
    ull n2 = E2;
    ull sum = 0;

    ull* d_n1;
    ull* d_n2;
    ull* d_sum;

    cudamalloc(&d_n1,sizeof(ull));
    cudamalloc(&d_n2,sizeof(ull));
    cudamalloc(&d_sum,sizeof(ull));

    cudamemcpy(d_n1,&n1,sizeof(ull),cudamemcpyHostToDevice);
    cudamemcpy(d_n2,&n2,cudamemcpyHostToDevice);
    cudamemcpy(d_sum,&sum,cudamemcpyHostToDevice);

    func <<<1,1000>>> (d_n1,d_n2,d_sum);

    cudamemcpy(&sum,d_sum,cudamemcpyDevicetoHost);

    std::cout << sum << std::endl;

    cudaFree(d_n1);
    cudaFree(d_n2);


    return 0;
}

解决方法

GPU和CUDA并非“神奇地快速制作程序”技术。您必须并行化算法并使用多个线程。

目前,您的代码将在所有涉及的内核上的非常相同内存上执行非常相同操作,这不仅浪费资源,而且还会绊倒它自己的脚,因为所有到同一位置的所有并发内存地址都会互相损害。

同时对数组求和也不是一件容易的事。您必须拆分并合并任务,然后递归地进行工作。

您确实必须绝对学习GPU的工作原理以及如何利用它们带来的好处。