Arrays CUDA编程修改块IDX.x索引 \uuuu全局\uuuuu无效添加(int*a、int*b、int*c){ int tid=blockIdx.x;//如果(tid

Arrays CUDA编程修改块IDX.x索引 \uuuu全局\uuuuu无效添加(int*a、int*b、int*c){ int tid=blockIdx.x;//如果(tid,arrays,cuda,Arrays,Cuda,上面的代码是2个向量的基本求和。但我想修改正在添加的数组的索引。 例如 如果我有我的第一个数组A=[1,2,3,4,5,6]和B=[10,20,30,40,50,60]。 我想让数组C=[1+60,2+50,3+40,4+30,5+20,6+10]使用A和B的元素。 blockIdx.x似乎自动增加了1,所以我不知道如何修改它。正如Shadow所说,每个线程都被分配了自己的threadIdx、blockDim、blockIdx和gridDim值。您不能修改它们 对于您的示例,您可以使用gridD

上面的代码是2个向量的基本求和。但我想修改正在添加的数组的索引。 例如 如果我有我的第一个数组A=[1,2,3,4,5,6]和B=[10,20,30,40,50,60]。 我想让数组C=[1+60,2+50,3+40,4+30,5+20,6+10]使用A和B的元素。
blockIdx.x似乎自动增加了1,所以我不知道如何修改它。

正如Shadow所说,每个线程都被分配了自己的
threadIdx
blockDim
blockIdx
gridDim
值。您不能修改它们

对于您的示例,您可以使用
gridDim.x
获得这样的块数。()

要确保
tid
保留在数组边界中,可以将数组元素数作为参数传递

__global__ void add(const int *a, const int *b, int *c)
{
    int tid = blockIdx.x;
    c[tid] = a[tid] + b[(gridDim.x - 1)- tid];
}
\uuuu全局\uuuuu无效添加(常量int*a、常量int*b、常量int*c、常量int N)
{
int tid=blockIdx.x;
如果(tid
如果像
add(a,b,c,6)
那样启动这个内核,那么
If(tid
是多余的,因为您只启动了6个块。但在一般情况下,您将启动多个块,其中每个块都有多个线程,并且在最后一个块中可能有一些填充线程

__global__ void add(const int *a, const int *b, int *c, const int N)
{
    int tid = blockIdx.x;
    if (tid < N)
        c[tid] = a[tid] + b[(gridDim.x - 1)- tid];
}
无符号整数N=1000;//元素总数
dim3 blkDim{32};
dim3 grdDim{(N+32-1)/32};
加上(a、b、c、N);
在这种情况下,必须检查数组索引的边界条件

unsigned int N = 1000; // total number of elements
dim3 blkDim{ 32 };
dim3 grdDim{ (N + 32 - 1) / 32 };
add<<<grdDim, blkDim>>>(a, b, c, N);
\uuuu全局\uuuuu无效添加(常量int*a、常量int*b、常量int*c、常量int N)
{
int tid=blockIdx.x*blockDim.x+threadIdx.x;
如果(tid
发布实际代码,而不是类似的代码。另外,不要垃圾邮件标签,这在某种意义上与c++/c没有什么关系。顺便说一句,请阅读数组长度,特别是第2章。简而言之:您不能修改
blockIdx
threadIdx
或类似变量。它们是每个线程的唯一组合。在非常特定的情况下,这个答案是有效的,但您至少应该提到,例如,填充可能是一个问题。传递数组大小(正如路人已经提到的)。很好。我感谢你花时间编辑你的答案。(顺便说一句,否决票不是我的,所以我不能把你推到“+1”)
unsigned int N = 1000; // total number of elements
dim3 blkDim{ 32 };
dim3 grdDim{ (N + 32 - 1) / 32 };
add<<<grdDim, blkDim>>>(a, b, c, N);
__global__ void add(const int *a, const int *b, int *c, const int N)
{
    int tid = blockIdx.x * blockDim.x + threadIdx.x;
    if (tid < N)
        c[tid] = a[tid] + b[(N - 1)- tid];
}