1

在 CUDA C Programming Guide Version 中有一小段关于内置向量类型。它说这个结构有 4 个组件,它们可以通过特定的方式访问, ei .x .y .z .w。4个组成部分是什么?有人可以举个例子吗?

此外,它说通过这条线int2 make_int2(int x, int y);,它构造了一个值为xy的向量。这些变量中的每一个都有 4 个组件?

我试图理解这些事情的原因是因为我正在研究以下代码:

  /*1*/ int  ny             = num_ofElements_y_ofmyMatrix;
  /*2*/ int  nx             = num_ofElements_x_ofmyMatrix;
  /*3*/ int2 matrix_index_2d = make_int2( ( blockIdx.x * blockDim.x ) + threadIdx.x, ( blockIdx.y * blockDim.y ) + threadIdx.y );

  /*4*/ int  matrix_index_1d = ( nx * matrix_index_2d.y ) + matrix_index_2d.x;

  /*5*/ if ( matrix_index_2d.x < nx && matrix_index_2d.y < ny )
  /*6*/ {
  /*7*/   float r = myMatrix[ matrix_index_1d ];
  /*8*/ } 

第3行和第 4行的索引是如何工作的?随后,矩阵myMatrix的访问权在谁工作?

更新:

就代码片段而言,通常当我访问数组时,我使用以下内容:

col = blockDim.x*blockIdx.x + threahIdx.x;
row = blockDim.x*blockIdx.x + threahIdx.x;
if (col < NUMCOLS && row < NUMROWS){...}

为了在 C++ 中对数组进行行主要访问,例如myMatrix[row*NUMCOLS + col].

与第3行和第 4行中使用的索引类型有什么联系?

4

1 回答 1

1

并非所有 CUDA 内置向量类型都有4分量。例如,double22 double组件。double2确实定义为

struct __device_builtin__ __builtin_align__(16) double2
{
    double x, y;
};

并可用于处理复杂的双精度数。根据上面的定义,您可以使用如下声明

double2 foo;

然后初始化两个 int2 make_int2(int x, int y); 和y组件作为

foo.x = 1.;
foo.y = 3.4;

再举一个例子,float4它有4 float分量,可用于处理 Minkowski 空间中的四向量。

在您的示例中,int2具有2整数分量和指令

int2 foo_int = make_int2(3,1);

构造一个foo_int类型的结构并将和组件分别int2初始化为和。xy31

于 2013-11-04T22:00:37.890 回答