返回数组的cuda设备函数

时间:2018-07-02 09:41:32

标签: cuda

尝试为此找到解决方案: Cuda Kernel使用多个 device 设备功能,其中一些需要返回数组。

我尝试这样做:

__device__ float *MatProd2dWxC(float *a2d, float  *b2d, int mGl, int nGl)
{
    int aRows = mGl; int aCols = nGl;
    int bRows = nGl; int bCols = 1;

    float *result;
    //result.resize(mGl*aRows);

    for (int i = 0; i < aRows; ++i) // each row of a
        for (int j = 0; j < bCols; ++j) // each col of b
            for (int k = 0; k < aCols; ++k) 
                result[i*mGl + j] += a2d[i*mGl + k] * b2d[k*mGl + j];

    return result;
}

不要编译它,因为要知道函数名中的指针不是一个好主意。但是如何做正确,如包含其他临时数组和将函数更改为void的想法。但是然后我需要在内核代码中多次使用它,寻找更优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

从设备函数返回指针是可以的,并且工作正常。

代码中的问题是您没有为result指针分配任何值,然后您将其取消引用并稍后从函数中返回。您需要使用float *result = malloc(mGl*aRows * sizeof(float));来分配内存(不要忘了以后再free()!)。

但是,更好的设计是将已经分配的指针传递到设备功能。这样可以确定分配的明确所有权(即,在您的代码中明确指出应调用free()的位置),并且在某些情况下(例如,可以将分配拉出循环。

此问题与CUDA无关,它也适用于标准C。