Cuda 线程块数之间的关系

Cuda 线程块数之间的关系,cuda,Cuda,这段代码来自一本叫做cuda的书 #include "../common/book.h" #define N (33 * 1024) __global__ void add( int *a, int *b, int *c ) { int tid = threadIdx.x + blockIdx.x * blockDim.x; while (tid < N) { c[tid] = a[tid] + b[tid]; tid += blockDi

这段代码来自一本叫做cuda的书

#include "../common/book.h"
#define N (33 * 1024)

__global__ void add( int *a, int *b, int *c ) {
    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    while (tid < N) {
        c[tid] = a[tid] + b[tid];
        tid += blockDim.x * gridDim.x;
    }  
}

                   .
                   .
                   .
add<<<128,128>>>( dev_a, dev_b, dev_c );
#包括“./common/book.h”
#定义N(33*1024)
__全局无效添加(int*a、int*b、int*c){
int tid=threadIdx.x+blockIdx.x*blockDim.x;
而(tid
33*1024=33792

128*128=16384

33792>16384


因此,在这种情况下,我是否必须增加每个块的线程数才能运行?

注意while循环主体中的第二个命令,即
tid+=blockDim.x*gridDim.x。它甚至可以用于比16384更大的阵列

ID为0的线程对位置0、16384、32768、

ID为1的线程对位置1、16385、32769、

注意while循环主体中的第二个命令,即
tid+=blockDim.x*gridDim.x。它甚至可以用于比16384更大的阵列

ID为0的线程对位置0、16384、32768、

ID为1的线程对位置1、16385、32769、

Sorry@stuhlo,但是我捕获了tid(threadIdx.x+blockIdx.x*blockDim.x)和offset(tid+(blockDim.x*gridDim.x))的值,我得到了以下结果:线程id 0地址:16384线程id 1地址:16385线程id 2地址:16386。。。线程id 16384地址:32768@user916933
tid
只是变量,每个线程都有自己的变量。在开始时,它保持每个启动线程的唯一ID,即它的值从0到16383。之后,它用于保存每个线程访问的索引,但不会修改线程的“真实”ID;我可以使用的最大N值是多少?@user916933它是无限的。在案例
add中(dev_a、dev_b、dev_c)您启动16384个线程,根据N个线程,每个线程和零、一个或多个数字相加。抱歉@stuhlo,但我捕获了tid(threadIdx.x+blockIdx.x*blockDim.x)和offset(tid+(blockDim.x*gridDim.x))的值我得到这个:线程id 0地址:16384线程id 1地址:16385线程id 2地址:16386。。。线程id 16384地址:32768@user916933
tid
只是变量,每个线程都有自己的变量。在开始时,它保持每个启动线程的唯一ID,即它的值从0到16383。之后,它用于保存每个线程访问的索引,但不会修改线程的“真实”ID;我可以使用的最大N值是多少?@user916933它是无限的。在案例
add中(dev_a、dev_b、dev_c)启动16384个线程,根据N,每个线程和零、一个或多个数字相加。