元素的 Cuda 数量大于分配的线程
Cuda number of elements is larger than assigned threads
我是 CUDA 编程新手。
我很好奇如果元素的数量大于线程的数量会发生什么?
在这个简单的 vector_add 示例中
__global__
void add(int n, float *x, float *y)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n)
y[i] = x[i] + y[i];
}
假设数组元素的个数是10,000,000。我们使用 64 个块和每个块 256 个线程调用此函数:
int n = 1e8;
int grid_size = 64;
int block_sie = 256;
那么,只分配了64*256 = 16384个线程,剩下的数组元素会怎样呢?
what would happen to the rest of the array elements?
什么都没有。他们不会被触动,并且会保持不变。当然,您的 x
数组元素无论如何都不会改变。所以我们在这里指的是 y
。 y[0..16383]
的值将反映矢量相加的结果。 y[16384..9999999]
的值将保持不变。
出于这个原因(为了方便地处理与所选网格大小无关的任意数据集大小),人们有时会建议 grid-stride-loop 内核设计。
我是 CUDA 编程新手。 我很好奇如果元素的数量大于线程的数量会发生什么?
在这个简单的 vector_add 示例中
__global__
void add(int n, float *x, float *y)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n)
y[i] = x[i] + y[i];
}
假设数组元素的个数是10,000,000。我们使用 64 个块和每个块 256 个线程调用此函数:
int n = 1e8;
int grid_size = 64;
int block_sie = 256;
那么,只分配了64*256 = 16384个线程,剩下的数组元素会怎样呢?
what would happen to the rest of the array elements?
什么都没有。他们不会被触动,并且会保持不变。当然,您的 x
数组元素无论如何都不会改变。所以我们在这里指的是 y
。 y[0..16383]
的值将反映矢量相加的结果。 y[16384..9999999]
的值将保持不变。
出于这个原因(为了方便地处理与所选网格大小无关的任意数据集大小),人们有时会建议 grid-stride-loop 内核设计。