gpt4 book ai didi

arrays - 将数据从设备复制到主机时出现无效的参数错误

转载 作者:行者123 更新时间:2023-12-02 04:02:46 43 4
gpt4 key购买 nike

我无法将数据从设备复制回主机。我的数据按结构排列:

typedef struct Array2D {
double* arr;
int rows;
int cols;
} Array2D;
arr是一个“扁平”数组。 rowscols描述尺寸。

下面的代码显示了我如何尝试将数据复制回主机:
h_output = (Array2D*) malloc(sizeof(Array2D));
cudaMemcpy(h_output, d_output, sizeof(Array2D), cudaMemcpyDeviceToHost);
double* h_arr = (double*) malloc(h_output->cols*h_output->rows*sizeof(double));
cudaMemcpy(h_arr, h_output->arr, h_output->cols*h_output->rows*sizeof(double), cudaMemcpyDeviceToHost);
h_output->arr = h_arr;

但是,在第四行中,执行失败,并出现cuda错误11(无效参数)。我不明白为什么会这样。数组的大小是正确的,我可以从主机访问 h_outputh_array,并且都具有“真实”地址。

编辑
对不起,您对更多信息的要求未能及时答复(=更多代码)。

通过尝试访问主机上设备指针的值,我已经测试了指针 d_output->arr是设备指针。不出所料,我不被允许这样做,以为 d_output->arr实际上是有效的设备指针。

该代码的目的是使用四阶Runge-Kutta方法求解Thiele的微分方程。
class CalculationSpecification
{

/* FUNCTIONS OMITTED */

public:
__device__ void RK4_n(CalculationSpecification* cs, CalcData data, Array2D* d_output)
{
double* rk4data = (double*)malloc((data.pdata->endYear - data.pdata->startYear + 1)*data.pdata->states*sizeof(double));

/* CALCULATION STUFF HAPPENS HERE */

// We know that rows = 51, cols = 1 and that rk4data contains 51 values as it should.
// This was confirmed by using printf directly in this function.
d_output->arr = rk4data;
d_output->rows = data.pdata->endYear - data.pdata->startYear + 1;
d_output->cols = data.pdata->states;
}
};


class PureEndowment : CalculationSpecification
{
/* FUNCTIONS OMITTED */

public:
__device__ void Compute(Array2D *result, CalcData data)
{
RK4_n(this, data, result);
}
};


__global__ void kernel2(Array2D *d_output)
{
/* Other code that initializes 'cd'. */
PureEndowment pe;
pe.Compute(d_output,cd);
}


void prepareOutputSet(Array2D* h_output, Array2D* d_output, int count)
{
h_output = (Array2D*) malloc(sizeof(Array2D));
cudaMemcpy(h_output, d_output, sizeof(Array2D), cudaMemcpyDeviceToHost); // After this call I can read the correct values of row, col as well as the address of the pointer.
double* h_arr = (double*) malloc(h_output->cols*h_output->rows*sizeof(double));
cudaMemcpy(h_arr, h_output->arr, h_output->cols*h_output->rows*sizeof(double), cudaMemcpyDeviceToHost)
h_output->arr = h_arr;
}

int main()
{
Array2D *h_output, *d_output;
cudaMalloc((void**)&d_output, sizeof(Array2D));

kernel2<<<1,1>>>(d_output);
cudaDeviceSynchronize();

prepareOutputSet(h_output, d_output, 1);

getchar();
return 0;
}

EDIT2

此外,我现在测试了在设备上运行时 d_output->arr的值是否与 h_output->arr中的第一个 cudaMemcpy -call之后的 prepareOutputSet值相同。

最佳答案

这(使用cudaMemcpy复制设备分配的内存)是CUDA 4.1中的已知限制。正在进行中的修复程序将在CUDA运行时的将来版本中发布。

关于arrays - 将数据从设备复制到主机时出现无效的参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9414020/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com