Cuda make_int2是如何工作的?
在CUDAC编程指南版本中有一小段关于内置向量类型的内容。它说这个结构有4个组件,它们可以通过一种特定的方式访问,即iCuda make_int2是如何工作的?,cuda,gpu,Cuda,Gpu,在CUDAC编程指南版本中有一小段关于内置向量类型的内容。它说这个结构有4个组件,它们可以通过一种特定的方式访问,即i.x.y.z.w。这4个组成部分是什么?有人能举个例子吗 此外,它还表示,使用这一行int2 make_int2(intx,inty)它构造一个值为x,y的向量。每个变量都有4个分量 我试图理解这些东西的原因是因为我正在研究以下代码: /*1*/ int ny = num_ofElements_y_ofmyMatrix; /*2*/ int n
.x.y.z.w
。这4个组成部分是什么?有人能举个例子吗
此外,它还表示,使用这一行int2 make_int2(intx,inty)代码>它构造一个值为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*/ }
/*1*/int ny=矩阵元素的数量;
/*2*/int nx=矩阵的元素数;
/*3*/int2 matrix\u index\u 2d=make\u int2((blockIdx.x*blockDim.x)+threadIdx.x,(blockIdx.y*blockDim.y)+threadIdx.y);
/*4*/int矩阵索引(nx*矩阵索引(2d.y)+矩阵索引(2d.x);
/*5*/if(矩阵索引2d.x
行3和4中的索引是如何工作的?随后,谁访问矩阵myMatrix正在工作
更新:
就代码片段而言,通常在访问数组时,我使用以下方法:
col = blockDim.x*blockIdx.x + threahIdx.x;
row = blockDim.x*blockIdx.x + threahIdx.x;
if (col < NUMCOLS && row < NUMROWS){...}
col=blockDim.x*blockIdx.x+threahIdx.x;
row=blockDim.x*blockIdx.x+threahIdx.x;
如果(列
以便在C++中有一行数组的主要访问,例如:代码> MyMatL[ReangNoMuls+Cal] < /C> >p>
与第3行和第4行中使用的索引类型有什么关系?并非所有CUDA内置向量类型都有4
组件。例如,double 2
具有2
double
组件double2
确实定义为
struct __device_builtin__ __builtin_align__(16) double2
{
double x, y;
};
并可用于处理复杂的双精度数字。根据上面的定义,您可以使用如下声明
double2 foo;
然后初始化两个int2 make_int2(intx,inty);和y
组件
foo.x = 1.;
foo.y = 3.4;
另一个例子是,float4
具有4
float
分量,可用于处理Minkowski空间中的四个向量
在您的示例中,int2
具有2
整数组件和指令
int2 foo_int = make_int2(3,1);
构造类型为int2
的foo_int
结构,并将x
和y
组件分别初始化为3
和1
。并非所有CUDA内置向量类型都有4
组件。例如,double 2
具有2
double
组件double2
确实定义为
struct __device_builtin__ __builtin_align__(16) double2
{
double x, y;
};
并可用于处理复杂的双精度数字。根据上面的定义,您可以使用如下声明
double2 foo;
然后初始化两个int2 make_int2(intx,inty);和y
组件
foo.x = 1.;
foo.y = 3.4;
另一个例子是,float4
具有4
float
分量,可用于处理Minkowski空间中的四个向量
在您的示例中,int2
具有2
整数组件和指令
int2 foo_int = make_int2(3,1);
构造类型为int2
的foo_int
结构,并将x
和y
组件分别初始化为3
和1
。,请参阅头文件/usr/local/cuda/include/vector_types.h
,了解其中定义的各种不同的向量类型,以及各种“构造函数”的/usr/local/cuda/include/vector_functions.h
。@RobertCrovella我想添加这些信息,但是你总是太快:-)无论如何,让我提一下,在Windows下,这些文件位于C:\Program files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include
。此外,请参阅头文件/usr/local/cuda/include/vector_types.h
,了解其中定义的各种不同的向量类型,以及各种“构造函数”的/usr/local/cuda/include/vector_functions.h
。@RobertCrovella我想添加这些信息,但是你总是太快:-)无论如何,让我提一下,在Windows下,这些文件位于C:\Program files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include
。关于你的更新,通过int x=blockIdx.x*blockDim.x+threadIdx.x获得联合全局内存访问代码>,inty=blockIdx.y*blockDim.y+threadIdx.y代码>和gmem[y*blockDim.x*gridDim.x+x]
。这似乎与3
和4
行一致,前提是内核是使用nx=blockDim.x*gridDim.x
启动的。关于更新,使用int x=blockIdx.x*blockDim.x+threadIdx.x获得联合全局内存访问代码>,inty=blockIdx.y*blockDim.y+threadIdx.y代码>和gmem[y*blockDim.x*gridDim.x+x]
。这似乎与3
和4
行一致,前提是内核是使用nx=blockDim.x*gridDim.x
启动的。