【发布时间】:2021-07-22 01:08:18
【问题描述】:
我在 Host 数组中展平了 4-D 数组。
我想复制 4-D 数组的一部分(红色区域),如下图所示。
我不知道如何复制未序列化的数组。
我复制一部分数组的原因是因为原始数组大小超过 10GB,我只需要它的 10%。
所以一开始,我用for循环尝试了它。但这花费了太多时间。
有没有更好的主意..?
int main(){
int nx = 100; ny = 200; nz = 300; nch = 400;
int idx_x_beg = 50; int_x_end = 100;
int idx_y_beg = 100; int_y_end = 200;
int idx_z_beg = 150; int_z_end = 300;
int idx_ch_beg = 200; int_ch_end = 400;
double *h_4dArray = (double *)malloc(sizeof(double)*nx*ny*nz*ch);
double *d_4dArray;
cudaMalloc((void**)&d_4dArray, (sizeof(cuDoubleReal)*nx*ny*nz*ch));
for (int temp_ch = 0; temp_ch < (idx_ch_end - idx_ch_beg + 1); temp_ch++) {
for (int temp_z = 0; temp_z < (idx_z_end - idx_z_beg + 1); temp_z++) {
for (int temp_y = 0; temp_y < (idx_y_end - idx_y_beg + 1); temp_y++) {
cudaMemcpy(d_4dArray + temp_ch*idx_z_size*idx_y_size*idx_x_size + temp_z*idx_y_size*idx_x_size + temp_y*idx_x_size
, h_4dArray + temp_ch*nz*ny*nx + temp_z*ny*nx + temp_y * nx + idx_x_beg
, sizeof(double)*(int_x_end - int_x_beg), cudaMemcpyHostToDevice)
}
}
}
return 0;
}
【问题讨论】:
-
你所展示的不可能是正确的;传递给
cudaMemcpy的指针没有指针运算。您总是从每个指针复制第一组字节。但抛开这一点,将所有内容复制到主机上的连续缓冲区。大致使用您所概述的内容,除了memcpy而不是cudaMemcpy(使用适当的指针算术/指针偏移量)。然后在单个cudaMemcpy调用中将该连续缓冲区复制到设备。 -
@RobertCrovella 抱歉,我复制了错误的代码版本。您的意思是复制每个可以通过 for 循环创建的起始指针,并使用单个
cudaMemcpy复制它吗? CUDA Samples 中有示例代码吗?