Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda 线程只能以16的倍数工作_Cuda - Fatal编程技术网

Cuda 线程只能以16的倍数工作

Cuda 线程只能以16的倍数工作,cuda,Cuda,下面是我的矩阵加法代码。d_m和d_n是两个矩阵,d_s是这两个矩阵的和 以下是我的内核函数: __global__ void Matrix_Add(float *d_m, float *d_n, float *d_s, long long int a, long long int b) { long long int i = blockIdx.y*blockDim.y + threadIdx.y; long long int j = blockIdx.x*blockDim.x

下面是我的矩阵加法代码。d_m和d_n是两个矩阵,d_s是这两个矩阵的和

以下是我的内核函数:

__global__ void Matrix_Add(float *d_m, float *d_n, float *d_s, long long int a, long long int b)
{
    long long int i = blockIdx.y*blockDim.y + threadIdx.y;
    long long int j = blockIdx.x*blockDim.x + threadIdx.x;

    if((i<a) && (j<b))
    {
        *(d_s + i*b + j) = *(d_m + i*b +j) + *(d_n + i*b + j);
    }

}
\uuuuu全局\uuuuu无效矩阵\u添加(浮点*d\m,浮点*d\n,浮点*d\s,长整型a,长整型b)
{
long long int i=blockIdx.y*blockDim.y+threadIdx.y;
long long int j=blockIdx.x*blockDim.x+threadIdx.x;

如果((i问题是您的网格大小计算严重中断,因此您没有运行足够的块(或者在a或b小于16的情况下,启动失败)

这:

正在对整数除法的结果执行
ceil
操作。除法过程中已发生截断,因此无法通过
ceil
调用进行舍入。例如

a = 20, b = 17
ceil(a/16) = ceil(20/16) = ceil(1) = 1
ceil(b/16) = ceil(27/16) = ceil(1) = 1
因此,只运行1个块,并且一些输入数据从未被处理(或者,如果a或b小于16,您将尝试启动0个块,这是一个运行时错误)

将块计算更改为类似以下内容:

dim3 DimGrid((a + 15) / 16, (b + 15) / 16 ,1);
您只需在运行时打印出
DimGrid
的值,就可以自己诊断出这个问题

a = 20, b = 17
ceil(a/16) = ceil(20/16) = ceil(1) = 1
ceil(b/16) = ceil(27/16) = ceil(1) = 1
dim3 DimGrid((a + 15) / 16, (b + 15) / 16 ,1);