我试图有效地在CUDA上循环二维数组.在我的主机代码中
double **h_matrix; // Matrix on host of size Nx by Ny
double tmp;
...
for(i = 0; i < Nx; i++) {
for(j = 0; j < Ny; j++) {
tmp = h_matrix[i][j];
... // Perform some operation on tmp
h_matrix[i][j] = tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
为了在CUDA中有效地执行类似的任务,我理解我必须使用cudaMallocPitch()
为2D数组分配内存,如CUDA编程指南中所示(例如滚动一下).这个例子并没有多大帮助,因为该内核不使用有关网格,块或线程执行它的任何信息,即使它是作为启动它<<<100, 512>>>
.
NVidia'a Parallel forall博客建议使用网格跨步循环来编写灵活且可扩展的内核,但是,他们的示例仅使用1D阵列.如何为使用cudaMallocPitch()
上面显示的代码并行化分配的2D数组编写网格步幅循环?我应该使用2D dimGrid和dimBlock,如果是这样,怎么样?
例如,如果我有一个2GB RAM的GPU,并且在我的应用程序中分配大型数组,如1GB,作为映射内存(映射到GPU地址空间的页锁定主机内存,分配cudaHostAlloc()
),将是可用GPU内存量减少1GB的映射内存,或者我仍然有(接近)2GB,因为我在分配和使用之前?
我正在尝试使用cudaMemcpy3D
来传输动态分配的 3d 矩阵(张量)。张量被分配为连续的内存块(参见下面的代码)。我尝试了cudaExtent
和的各种组合cudaMemcpy3DParms
,但是元素的顺序混淆了。我创建了以下示例来演示该问题:
#include <stdio.h>
int ***alloc_tensor(int Nx, int Ny, int Nz) {
int i, j;
int ***tensor;
tensor = (int ***) malloc((size_t) (Nx * sizeof(int **)));
tensor[0] = (int **) malloc((size_t) (Nx * Ny * sizeof(int *)));
tensor[0][0] = (int *) malloc((size_t) (Nx * Ny * Nz * sizeof(int)));
for(j = 1; j < Ny; j++)
tensor[0][j] = tensor[0][j-1] + Nz;
for(i = 1; i < Nx; i++) {
tensor[i] = tensor[i - …
Run Code Online (Sandbox Code Playgroud) 假设我有一个平坦的,动态分配的1d数组(我们称之为vector
),它将包含一些3d数据.有没有办法创建另一个指针(让我们称之为tensor
)"看到" vector
为3d数组,所以我可以访问它tensor[i][j][k]
?
我尝试了以下,但它不起作用:
int x, y, z; //Number of rows, cols, ...
double *vector;
double ***tensor;
x = 10; y = 10; z = 10;
vector = (double *) malloc(x * y * z * sizeof(double));
tensor = (double ***) vector;
tensor[0] = (double **) vector;
tensor[0][0] = (double *) vector;
for(j = 1; j < y; j++) {
tensor[0][j] = tensor[0][j-1] + z;
}
for(i = 1; i < x; i++) { …
Run Code Online (Sandbox Code Playgroud)