在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 行中使用的索引类型有什么联系?
答案 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;
另一个例子是,float4
有4
float
个组件,可以用来处理Minkowski空间中的四向量。
在您的示例中,int2
具有2
个整数组件和指令
int2 foo_int = make_int2(3,1);
构建foo_int
类型的int2
结构,并将x
和y
组件分别初始化为3
和1
。