尝试为此找到解决方案: 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的想法。但是然后我需要在内核代码中多次使用它,寻找更优雅的解决方案。
答案 0 :(得分:1)
从设备函数返回指针是可以的,并且工作正常。
代码中的问题是您没有为result
指针分配任何值,然后您将其取消引用并稍后从函数中返回。您需要使用float *result = malloc(mGl*aRows * sizeof(float));
来分配内存(不要忘了以后再free()
!)。
但是,更好的设计是将已经分配的指针传递到设备功能。这样可以确定分配的明确所有权(即,在您的代码中明确指出应调用free()
的位置),并且在某些情况下(例如,可以将分配拉出循环。
此问题与CUDA无关,它也适用于标准C。