cuda - 使用 cudaMallocPitch 分配 2D 数组并使用 cudaMemcpy2D 复制

标签 cuda

我是 CUDA 的新手,感谢您的帮助,并希望您能帮助我。

我需要将二维数组的多个元素存储到向量中,然后使用该向量,但是我的代码不能很好地工作,当我调试时,我发现在设备中使用cudaMallocPitch分配二维数组时出现错误并使用 cudaMemcpy2D 复制到该数组。这是我的代码:

#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cmath>

#define maxThreads 96

__global__ void extract(int mSize, float* dev_vector, float* dev_matrix, int N)
{
    int idx = threadIdx.x + blockIdx.x * blockDim.x;

    while(idx<N)
    {
        dev_vector[idx] = *(dev_matrix+(mSize*idx+N));
        idx += blockDim.x * gridDim.x;
    }
}

int main()
{
    //CPU variables
    int mSize = 5;
    float* matrix;
    int N = 4; // Vector size
    int i,j;
    float* vector;
    int blocks, threads;

    float* dev_matrix;
    float* dev_vector;

    blocks = 1+((N-1)/maxThreads);
    threads = 1+((N-1)/blocks);

    unsigned long int pitch;
    unsigned long int memsize_vector = N*sizeof(float);
    unsigned long int memsize_matrix = mSize*sizeof(float);


    matrix = new float[memsize_matrix*memsize_matrix];
    vector = new float[memsize_vector];

    //Create 2D array
    for(i=0; i<mSize; i++)
        for(j=0; j<mSize; j++)
        {
            matrix[i+mSize*j] = ((i+1)+(j+1));
        }

    printf("\n");
    for (i=0; i<mSize; i++){
        for(j=0; j<mSize; j++){
            printf("% 1.5f ", matrix[i+mSize*j]);
        }
        printf("\n");
    }
    printf("\n");


    cudaMallocPitch((void **)&dev_matrix, &pitch, memsize_matrix, mSize);
    cudaMalloc((void **)&dev_vector, memsize_vector);

    cudaMemcpy2D(dev_matrix, pitch, matrix, memsize_matrix, memsize_matrix, mSize,
                     cudaMemcpyHostToDevice);

    extract<<<blocks,threads>>>(mSize, dev_vector, dev_matrix, N);
    cudaDeviceSynchronize();

    cudaMemcpy(vector, dev_vector, memsize_vector, cudaMemcpyDeviceToHost);

    printf("Vector values are:\n");
    for(i=0; i<N; i++)
        printf(" % 1.5f ", vector[i]);
    printf("\n");

    cudaFree(dev_matrix);
    cudaFree(dev_vector);

}

最佳答案

此代码中存在很多问题,包括但不限于在代码中的多个位置交替使用以字节为单位的数组大小和字大小、使用不正确的类型(请注意 size_t 的存在有一个很好的理由)、潜在的截断和类型转换问题等等。

但核心问题是内核内部的音调内存的寻址,您甚至从未将音调值传递给该内存。阅读documentation for cudaMallocPitch 将为您提供在内核内寻址倾斜内存的正确方法。您的内核可能如下所示:

__global__ void extract(size_t mpitch, float* dev_vector, float* dev_matrix, int N)
{
    int idx = threadIdx.x + blockIdx.x * blockDim.x;
    int stride = blockDim.x * gridDim.x;

    while(idx<N)
    {          
        dev_vector[idx] = *(float *)( ((char*)dev_matrix + idx * mpitch) + N );
        idx += stride;
    }
}

[免责声明:从未编译或测试,使用风险自负]。

您将必须修复主机代码中的所有问题,以反射(reflect)您所做的任何内核更改。

关于cuda - 使用 cudaMallocPitch 分配 2D 数组并使用 cudaMemcpy2D 复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14991667/

相关文章:

cuda - 在将 CUDA 与 MATLAB 一起使用时,是否可以从 mex 接口(interface)分配固定内存?

c++ - CUDA - 简单的复数乘法

compiler-construction - 当编译器不提供 uint8_t 时,有什么好的替代方法?

cuda - 那就是代码 : 中的错误 "expression must have integral or enum type"

c++ - CUDA 在运行时检查 nvcc "-arch"-flag

ubuntu - CUDA 2.1 "error: unknown type name ' size_t'"

cuda - 将 CUDA 纹理绑定(bind)到 float 图像

c++ - 如何从传递的数组中正确构造 CUSP coo 矩阵

compiler-errors - 带置换迭代器的推力删除不起作用

java - 如何将结构传递给 JCuda 中的内核