使用CUDA创建二维阵列

使用CUDA创建二维阵列,cuda,multidimensional-array,Cuda,Multidimensional Array,在cuda c编程指南文档中,有一个显示2d数组的示例: // Kernel definition __global__ void MatAdd(float A[N][N], float B[N][N], float C[N][N]) { int i = blockIdx.x * blockDim.x + threadIdx.x; int j = blockIdx.y * blockDim.y + threadIdx.y; if (i < N && j < N) C[

在cuda c编程指南文档中,有一个显示2d数组的示例:

// Kernel definition
__global__ void MatAdd(float A[N][N], float B[N][N], float C[N][N])
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
if (i < N && j < N)
C[i][j] = A[i][j] + B[i][j];
}

int main()
{
...
// Kernel invocation
dim3 threadsPerBlock(16, 16);
dim3 numBlocks(N / threadsPerBlock.x, N / threadsPerBlock.y);
MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C);
...
}
//内核定义
__全局无效MatAdd(浮点A[N][N]、浮点B[N][N]、浮点C[N][N])
{
int i=blockIdx.x*blockDim.x+threadIdx.x;
int j=blockIdx.y*blockDim.y+threadIdx.y;
if(i
我使用2d数组的形式如下,并且工作正常:

dim3 grid[COLUMNS][ROWS];
kernel_Matrix<<<grid,1>>>(dev_strA, dev_strB, dev_Matrix);

__global__ void add(int *a, int *b, int *c)
{
int x = blockIdx.x;
int y = blockIdx.y;
int i = (COLUMNS*y) + x;
c[i] = a[i] + b[i];
}
dim3网格[列][行];
内核矩阵(dev_strA、dev_strB、dev_矩阵);
__全局无效添加(int*a、int*b、int*c)
{
int x=blockIdx.x;
int y=块idx.y;
int i=(列*y)+x;
c[i]=a[i]+b[i];
}

有一种方法可以实现具有[][]定义的二维数组?我用这种方法测试,但不起作用

dim3不是数组,而是CUDA头文件(vector_types.h)中定义的结构。此结构用于在全局函数的执行配置中指定网格的尺寸,即在
>
中。它没有保留“真实”块,只是配置了一些将要执行的块

据我所知,初始化此结构的方法只有两种:
1. <代码>dim3网格(x、y、z)
2. <代码>dim3网格={x,y,z}

编辑: 主机代码带有
dim3
初始化,并通过将数组传递给内核函数的方式,您将能够通过
[]]
访问其元素:

float A[N][N];
float B[N][N];
float C[N][N];

float (*d_A)[N]; //pointers to arrays of dimension N
float (*d_B)[N];
float (*d_C)[N];

for(int i = 0; i < N; i++) {
    for(int j = 0; j < N; j++) {
        A[i][j] = i;
        B[i][j] = j;
    }
}       

//allocation
cudaMalloc((void**)&d_A, (N*N)*sizeof(float));
cudaMalloc((void**)&d_B, (N*N)*sizeof(float));
cudaMalloc((void**)&d_C, (N*N)*sizeof(float));

//copying from host to device
cudaMemcpy(d_A, A, (N*N)*sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_B, B, (N*N)*sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_C, C, (N*N)*sizeof(float), cudaMemcpyHostToDevice);

// Kernel invocation
dim3 threadsPerBlock(16, 16);
dim3 numBlocks(N / threadsPerBlock.x, N / threadsPerBlock.y);
MatAdd<<<numBlocks, threadsPerBlock>>>(d_A, d_B, d_C);

//copying from device to host
cudaMemcpy(A, (d_A), (N*N)*sizeof(float), cudaMemcpyDeviceToHost);
cudaMemcpy(B, (d_B), (N*N)*sizeof(float), cudaMemcpyDeviceToHost);
cudaMemcpy(C, (d_C), (N*N)*sizeof(float), cudaMemcpyDeviceToHost);
float A[N][N];
浮动B[N][N];
浮点数C[N][N];
浮动(*d_A)[N]//指向维度为N的数组的指针
浮动(*d_B)[N];
浮动(*d_C)[N];
对于(int i=0;i
dim3
不是数组,而是CUDA头文件(vector_types.h)中定义的结构。此结构用于在全局函数的执行配置中指定网格的尺寸,即在
>
中。它没有保留“真实”块,只是配置了一些将要执行的块

据我所知,初始化此结构的方法只有两种:
1. <代码>dim3网格(x、y、z)
2. <代码>dim3网格={x,y,z}

编辑: 主机代码带有
dim3
初始化,并通过将数组传递给内核函数的方式,您将能够通过
[]]
访问其元素:

float A[N][N];
float B[N][N];
float C[N][N];

float (*d_A)[N]; //pointers to arrays of dimension N
float (*d_B)[N];
float (*d_C)[N];

for(int i = 0; i < N; i++) {
    for(int j = 0; j < N; j++) {
        A[i][j] = i;
        B[i][j] = j;
    }
}       

//allocation
cudaMalloc((void**)&d_A, (N*N)*sizeof(float));
cudaMalloc((void**)&d_B, (N*N)*sizeof(float));
cudaMalloc((void**)&d_C, (N*N)*sizeof(float));

//copying from host to device
cudaMemcpy(d_A, A, (N*N)*sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_B, B, (N*N)*sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_C, C, (N*N)*sizeof(float), cudaMemcpyHostToDevice);

// Kernel invocation
dim3 threadsPerBlock(16, 16);
dim3 numBlocks(N / threadsPerBlock.x, N / threadsPerBlock.y);
MatAdd<<<numBlocks, threadsPerBlock>>>(d_A, d_B, d_C);

//copying from device to host
cudaMemcpy(A, (d_A), (N*N)*sizeof(float), cudaMemcpyDeviceToHost);
cudaMemcpy(B, (d_B), (N*N)*sizeof(float), cudaMemcpyDeviceToHost);
cudaMemcpy(C, (d_C), (N*N)*sizeof(float), cudaMemcpyDeviceToHost);
float A[N][N];
浮动B[N][N];
浮点数C[N][N];
浮动(*d_A)[N]//指向维度为N的数组的指针
浮动(*d_B)[N];
浮动(*d_C)[N];
对于(int i=0;i
也许我误解了你的问题。你想干什么?将2D数组传递给您的内核函数或定义2D网格?@stuhlo:我想将2D数组传递给内核,并使用[][]定义在全局void函数中访问它。您需要按照stuhlo的指示修复
dim3网格的定义。然后你可能想看看一些想法。通常平坦2D数组是最容易的,但是如果你有一个固定大小的数组,你可以使用我在回答这个问题时给出的第一个例子中的方法。我添加了主机代码,在设备上分配内存,从主机到设备内存复制数据,启动内核,最后从设备到主机内存复制数据。别忘了给CUDA电话提供错误检查。也许我误解了你的问题。你想干什么?将2D数组传递给您的内核函数或定义2D网格?@stuhlo:我想将2D数组传递给内核,并使用[][]定义在全局void函数中访问它。您需要按照stuhlo的指示修复
dim3网格的定义。然后你可能想看看一些想法。通常平坦2D数组是最容易的,但是如果你有一个固定大小的数组,你可以使用我在回答这个问题时给出的第一个例子中的方法。我添加了主机代码,在设备上分配内存,从主机到设备内存复制数据,启动内核,最后从设备到主机内存复制数据。不要忘记为CUDA调用提供错误检查。