Cuda 线程块数之间的关系
这段代码来自一本叫做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
#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@user916933tid
只是变量,每个线程都有自己的变量。在开始时,它保持每个启动线程的唯一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@user916933tid
只是变量,每个线程都有自己的变量。在开始时,它保持每个启动线程的唯一ID,即它的值从0到16383。之后,它用于保存每个线程访问的索引,但不会修改线程的“真实”ID;我可以使用的最大N值是多少?@user916933它是无限的。在案例add中(dev_a、dev_b、dev_c)代码>启动16384个线程,根据N,每个线程和零、一个或多个数字相加。