相关疑难解决方法(0)

将float*转换为char*,同时在设备上的线性内存中循环2-D数组

在CUDA 4.0编程指南的第21页上,有一个示例(如下所示)来说明在设备存储器中循环2D浮点数组的元素.2D的尺寸是宽度*高度

// Host code
int width = 64, height = 64;
float* devPtr;
size_t pitch;
cudaMallocPitch(&devPtr, &pitch,
width * sizeof(float), height);
MyKernel<<<100, 512>>>(devPtr, pitch, width, height);


// Device code
__global__ void MyKernel(float* devPtr, size_t pitch, int width, int height)
{
   for (int r = 0; r < height; ++r) 
    {
       float* row = (float*)((char*)devPtr + r * pitch);
          for (int c = 0; c < width; ++c) 
              {
              float element = row[c];
              }
     }
}
Run Code Online (Sandbox Code Playgroud)

为什么devPtr设备内存指针被强制转换为 …

c++ pointers cuda

4
推荐指数
1
解决办法
1334
查看次数

cudamemcpy函数使用

在这种情况下,cudaMemcpy 函数将如何工作?

我已经声明了一个这样的矩阵

float imagen[par->N][par->M];
Run Code Online (Sandbox Code Playgroud)

我想将其复制到 cuda 设备,所以我这样做了

float *imagen_cuda;

int tam_cuda=par->M*par->N*sizeof(float);

cudaMalloc((void**) &imagen_cuda,tam_cuda); 
cudaMemcpy(imagen_cuda,imagen,tam_cuda,cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)

这可以将二维数组复制到一维数组中吗?

如何复制到另一个二维数组?我可以改变这个吗?它会起作用吗?

float **imagen_cuda;
Run Code Online (Sandbox Code Playgroud)

cuda

4
推荐指数
1
解决办法
3万
查看次数

将2D阵列复制到已知可变宽度的GPU

我正在研究如何将每行的可变宽度的2D数组复制到GPU中.

int rows = 1000;
int cols;
int** host_matrix = malloc(sizeof(*int)*rows);
int *d_array;
int *length;

...
Run Code Online (Sandbox Code Playgroud)

每个人host_matrix[i]可能都有不同的长度,我知道length[i],问题就出在那里.我想避免复制虚拟数据.有没有更好的方法呢?

根据这个帖子,这不是一个聪明的方法:

cudaMalloc(d_array, rows*sizeof(int*));  
for(int i = 0 ; i < rows ; i++)    {  
    cudaMalloc((void **)&d_array[i], length[i] * sizeof(int)); 
}  
Run Code Online (Sandbox Code Playgroud)

但我想不出任何其他方法.有没有其他更聪明的方法呢?可以使用cudaMallocPitch和cudaMemCpy2D进行改进吗?

cuda gpu gpgpu nvidia

1
推荐指数
1
解决办法
2385
查看次数

CUDA,使用2D和3D阵列

在线上有很多关于在CUDA上分配,复制,索引等2d和3d数组的问题。我得到了很多矛盾的答案,因此我试图汇编过去的问题,看看我是否可以提出正确的问题。

第一个链接:https : //devtalk.nvidia.com/default/topic/392370/how-to-cudamalloc-two-Dimension-array-/

问题:分配二维指针数组

用户解决方案:使用mallocPitch

“正确”的低效率解决方案:在for循环中为每行使用malloc和memcpy(荒谬的开销)

“更正确”的解决方案:将其压缩为1d数组的“专业意见”,有评论说没有人关注性能,但在gpu上使用2d指针结构

第二个链接:https : //devtalk.nvidia.com/default/topic/413905/passing-a-multiDimension-array-to-kernel-how-to-allocate-space-in-host-and-pass-to-device -/

问题:在主机上分配空间并将其传递给设备

子链接:https : //devtalk.nvidia.com/default/topic/398305/cuda-programming-and-performance/dynamically-allocate-array-of-structs/

子链接解决方案:在GPU上编码基于指针的结构是一种糟糕的体验,并且效率极低,因此将其压缩为一维数组。

第三个链接:在CUDA中的设备内存上分配2D阵列

问题:分配和传输二维数组

用户解决方案:使用mallocPitch

其他解决方案:将其展平

第四个链接:如何在CUDA中使用2D阵列?

问题:分配和遍历二维数组

提交的解决方案:不显示分配

其他解决方案:压扁

还有许多其他消息来源大多在说同样的话,但是在多个实例中,我看到有关GPU上指针结构的警告。

许多人认为分配指针数组的正确方法是为每行调用malloc和memcpy,但函数mallocPitch和memcpy2D存在。这些功能的效率有所降低吗?为什么这不是默认答案?

二维数组的另一个“正确”答案是将它们压缩成一个数组。我是否应该习惯生活中的事实?我对我的代码非常拘谨,对我来说感觉很不雅。

我正在考虑的另一种解决方案是使使用1d指针数组的矩阵类最大化,但是我找不到实现双括号运算符的方法。

还要根据此链接:将对象复制到设备?

和子链接答案:cudaMemcpy分段错误

这有点浮躁。

我想全部使用CUDA的类都具有2 / 3d数组,将这些转换为CUDA的1d数组会不会有很多开销?

我知道我已经问了很多问题,但总的来说,我应该习惯于将数组压缩为现实,还是可以使用二维分配和复制函数而不会产生不好的开销,例如在for中调用alloc和cpy的解决方案中环?

c++ arrays cuda

1
推荐指数
1
解决办法
3421
查看次数

标签 统计

cuda ×4

c++ ×2

arrays ×1

gpgpu ×1

gpu ×1

nvidia ×1

pointers ×1