Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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翘曲和螺纹发散_Cuda_Warp Scheduler - Fatal编程技术网

CUDA翘曲和螺纹发散

CUDA翘曲和螺纹发散,cuda,warp-scheduler,Cuda,Warp Scheduler,我试图了解CUDA翘曲和线程发散。假设我有一个简单的矩阵乘法内核来乘法nxn矩阵 __global__ void matrix_multiply(float* a, float* b, float* c, int n) { int row = blockIdx.y + blockDim.y + threadIdx.y; int col = blockIdx.x + blockDim.x + threadIdx.x; if(row < n && co

我试图了解CUDA翘曲和线程发散。假设我有一个简单的矩阵乘法内核来乘法nxn矩阵

__global__ void matrix_multiply(float* a, float* b, float* c, int n)
{
    int row = blockIdx.y + blockDim.y + threadIdx.y;
    int col = blockIdx.x + blockDim.x + threadIdx.x;

    if(row < n && col < n) {
        float tmp = 0.0f;
        for(int i = 0; i < n; ++i)
            tmp += a[row * n + i] * b[i * n + col];
        c[row * n + col] = tmp;
    }
}
\uuuuu全局\uuuuu无效矩阵\u乘法(浮点*a、浮点*b、浮点*c、整数n)
{
int row=blockIdx.y+blockDim.y+threadIdx.y;
int col=blockIdx.x+blockDim.x+threadIdx.x;
如果(行
如果我启动一个网格大小为32×32,块大小为16×16的内核,矩阵是500×500,那么有多少扭曲的线程会遇到线程分歧


由于矩阵右边缘上的每个线程块都有线程发散,那么具有线程发散的扭曲的数量不应该是256吗?

代码中有两个潜在的发散点。第一个可以通过
if
语句创建,第二个可以通过
for
循环中的条件创建。从扭曲散度的角度来看,第二个是无害的,因为输入
n
在线程之间是一致的

对于第一种情况,那些不满足条件的线程将很快退出。如果
n
为500(看起来是),则快速存在的线程数为(16*16)*(32*32)-(500*500)=12144。考虑到问题的答案,有250个翘曲面对发散,每一个都来自穿过右边缘的16*16最上面块中的两行。在每一条车道中,ID为0、1、2、3、16、17、18和19的车道满足条件并进入
if
块,而其余车道被禁用。将有6*(512/16)=192架战机,
如果
条件对所有飞机都为假,因此它们不会面临发散

下图显示了在最右下角的瓷砖中发生的情况