make_int2是如何工作的?

时间:2013-11-04 21:52:50

标签: cuda gpu

在CUDA C编程指南版本中有一个关于内置矢量类型的小段落。它说这个结构有4个组件,可以通过特定的方式访问,e。.x .y .z .w。 4个组件是什么?有人能举个例子吗?

此外,它表示使用此行int2 make_int2(int x, int y);构建一个值为 x y 的向量。这些变量中的每一个都有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 行中使用的索引类型有什么联系?

1 个答案:

答案 0 :(得分:1)

并非所有CUDA内置向量类型都有4个组件。例如,double2包含2 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;

另一个例子是,float44 float个组件,可以用来处理Minkowski空间中的四向量。

在您的示例中,int2具有2个整数组件和指令

int2 foo_int = make_int2(3,1);

构建foo_int类型的int2结构,并将xy组件分别初始化为31