没有线程的GPU内核Blocksize / Gridsize

时间:2016-08-01 20:12:25

标签: python cuda gpu

我目前正在通过pycuda / cuda在gpu上编写一些数值方法,并且正在编写自己的内核。在某些时候,我需要估计至少1000个耦合ODE的误差。我不想复制包含超过1000个条目的几个向量,所以我创建了一个内核(在帖子的底部),这是一个基本的最大函数。这些%(T)s和%(N)是我在运行时进行的字符串替换,这与此问题无关(T表示复杂的数据类型,N表示耦合的ODE的数量)。

我的问题是:不需要并行计算,所以我不使用线程。当我在python中调用这个函数时,我应该指定什么是blocksize或gridsize?

        __global__ void get_error(double *max_error,%(T)s error_vec[1][%(N)s])
    {
        max_error[0]=error_vec[0][0].real();
        for(int ii=0;ii<%(N)s;ii=ii+1)
        {
            if(max_error[0] < error_vec[0][ii].real())
            {
                max_error[0]=error_vec[0][ii].real();
            }
        }
        return;
    }

1 个答案:

答案 0 :(得分:1)

在内核启动中,将在GPU上旋转的线程总数等于为启动指定的网格大小和块大小的乘积。

这两个值都必须是正整数,因此唯一可能的组合是1,1来创建单个线程的启动。

CUDA内核不需要对内置变量(例如blockIdxthreadIdx等)进行任何特定引用,但通常这样做是为了区分线程之间的行为。如果您只启动了一个线程,则没有特别的理由使用这些变量,并且没有必要这样做。

只有单个线程的CUDA内核启动并不是完成工作的高效方法,但可能会有一些特定的情况,这样做很方便,并且对整个应用程序没有显着的性能影响。

对我而言,为什么你提出的内核无法重新组合成一个线程并行内核(它似乎正在执行max-finding reduction)并不明显,但这似乎与问题的关键点。