CUDA 中的二维数组
two-dimensional arrays in CUDA
我正在练习这个简单的代码,它接受一个二维数组并用 CUDA 对它们求和。最后C的结果不是我接受的。另外,我想知道我是否可以使用 vector
而不是 c 风格的数组。
#include <iostream>
using namespace std;
#define N 2
__global__ void MatAdd(double** a, double** b,
double** c)
{
int i = threadIdx.x;
int j = threadIdx.y;
c[i][j] = a[i][j] + b[i][j];
}
int main()
{
double a[2][2]= {{1.0,2.0},{3.0,4.0}};
double b[2][2]= {{1.0,2.0},{3.0,4.0}};
double c[2][2]; // it will be the result!
double** a_d;
double** b_d;
double** c_d;
int d_size = N * N * sizeof(double);
int numBlocks = 1;
dim3 threadsPerBlock(N, N);
cudaMalloc(&a_d, d_size);
cudaMalloc(&b_d, d_size);
cudaMalloc(&c_d, d_size);
cudaMemcpy(a_d, a, d_size, cudaMemcpyHostToDevice);
cudaMemcpy(b_d, b, d_size, cudaMemcpyHostToDevice);
cudaMemcpy(c_d, c, d_size, cudaMemcpyHostToDevice);
MatAdd<<<numBlocks, threadsPerBlock>>>(a_d, b_d, c_d);
//cudaDeviceSynchronize();
cudaMemcpy(c, c_d, d_size, cudaMemcpyDeviceToHost);
for (int i=0; i<N; i++){
for(int j=0; j<N; j++){
cout<<c[i][j]<<endl;
}
}
return 0;
}
在这种情况下,您不能使用 double**
类型。或者,您应该使用一个展平数组,它包含double*
类型变量.[=中给定矩阵的所有值。 22=]
问题的核心位于以下行(以及类似的后续行):
cudaMemcpy(a_d, a, d_size, cudaMemcpyHostToDevice);
这里假设 a
和 a_d
是兼容类型,但它们不是。 double**
类型的变量是一个指针,它引用内存中的一个或多个指针(通常是一个指针数组引用许多不同的 double
类型的数组),而 double*
类型的变量或静态二维 C 数组引用内存中的连续位置。
请注意,您可以使用 matrix[N*i+j]
访问矩阵的给定 (i,j)
单元格,其中 N
是列数,假设矩阵是类型 double*
并使用 行优先顺序 .
我正在练习这个简单的代码,它接受一个二维数组并用 CUDA 对它们求和。最后C的结果不是我接受的。另外,我想知道我是否可以使用 vector
而不是 c 风格的数组。
#include <iostream>
using namespace std;
#define N 2
__global__ void MatAdd(double** a, double** b,
double** c)
{
int i = threadIdx.x;
int j = threadIdx.y;
c[i][j] = a[i][j] + b[i][j];
}
int main()
{
double a[2][2]= {{1.0,2.0},{3.0,4.0}};
double b[2][2]= {{1.0,2.0},{3.0,4.0}};
double c[2][2]; // it will be the result!
double** a_d;
double** b_d;
double** c_d;
int d_size = N * N * sizeof(double);
int numBlocks = 1;
dim3 threadsPerBlock(N, N);
cudaMalloc(&a_d, d_size);
cudaMalloc(&b_d, d_size);
cudaMalloc(&c_d, d_size);
cudaMemcpy(a_d, a, d_size, cudaMemcpyHostToDevice);
cudaMemcpy(b_d, b, d_size, cudaMemcpyHostToDevice);
cudaMemcpy(c_d, c, d_size, cudaMemcpyHostToDevice);
MatAdd<<<numBlocks, threadsPerBlock>>>(a_d, b_d, c_d);
//cudaDeviceSynchronize();
cudaMemcpy(c, c_d, d_size, cudaMemcpyDeviceToHost);
for (int i=0; i<N; i++){
for(int j=0; j<N; j++){
cout<<c[i][j]<<endl;
}
}
return 0;
}
在这种情况下,您不能使用 double**
类型。或者,您应该使用一个展平数组,它包含double*
类型变量.[=中给定矩阵的所有值。 22=]
问题的核心位于以下行(以及类似的后续行):
cudaMemcpy(a_d, a, d_size, cudaMemcpyHostToDevice);
这里假设 a
和 a_d
是兼容类型,但它们不是。 double**
类型的变量是一个指针,它引用内存中的一个或多个指针(通常是一个指针数组引用许多不同的 double
类型的数组),而 double*
类型的变量或静态二维 C 数组引用内存中的连续位置。
请注意,您可以使用 matrix[N*i+j]
访问矩阵的给定 (i,j)
单元格,其中 N
是列数,假设矩阵是类型 double*
并使用 行优先顺序 .