2

我是 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);

}
4

3 回答 3

1

谢谢大家,亚历克斯我还没有看到,并修复它,谢谢。

talonmies,谢谢你,我的代码工作,你的建议。非常感谢,最后这是我的内核:

__global__ void sumreduct(size_t pitch, float* dev_vector, float* dev_matrix, int  columns, 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 * pitch) + columns);
    idx += stride;
} 
}

关于“size_t”,我使用的是“Unsigned int”,因为 Nsight 向我显示下一个警告:

类型“size_t”无法解析

谢谢

于 2013-02-21T21:00:46.197 回答
1

这段代码有很多问题,包括但不限于在代码中的几个地方交替使用字节数组大小和字大小,使用不正确的类型(注意这size_t是有充分理由的),潜在的截断和类型转换问题,和更多。

但核心问题是内核内部的音高内存的寻址,您甚至从未将音高值传递给它。阅读文档将为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;
    }
}

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

您将不得不修复主机代码中的所有问题,以反映您所做的任何内核更改。

于 2013-02-21T06:40:09.720 回答
0

您真的要声明长度为 [memsizeMatrix*memsizeMatrix] 的源矩阵吗?

这将分配 400 个浮点数,或 1600 个字节。这意味着您的源音调已关闭,并且 Memcpy2D 调用失败。

我假设你的意思是说

matrix = new float[mSize*mSize];
于 2013-02-20T23:38:56.267 回答