Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda make_int2是如何工作的?_Cuda_Gpu - Fatal编程技术网

Cuda make_int2是如何工作的?

Cuda 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

在CUDAC编程指南版本中有一小段关于内置向量类型的内容。它说这个结构有4个组件,它们可以通过一种特定的方式访问,即i
.x.y.z.w
。这4个组成部分是什么?有人能举个例子吗

此外,它还表示,使用这一行
int2 make_int2(intx,inty)它构造一个值为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*/ } 
/*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
34中的索引是如何工作的?随后,谁访问矩阵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
启动的。