C/C++ 中的动态分配是否“总是”在连续内存中完成(CUDA 推力::转换相关)?

问题描述 投票:0回答:0

我正在尝试比较

arr
arr2
的每个元素并将其存储回
arr2

到目前为止我所拥有的是

int main() {
  double *arr,  *arr2;
  double *darr, *darr2;

  // allocate
  int N = 5;
  arr   = new double[N];
  arr2  = new double[N];

  cudaMalloc((void **)&darr,  N*sizeof(double));
  cudaMalloc((void **)&darr2, N*sizeof(double));

  // set values
  arr[0] = 1.;
  arr[1] = -1.;
  arr[2] = 3.;
  arr[3] = 9.;
  arr[4] = 5.;

  arr2[0] = 1e-3;
  arr2[1] = 6.;
  arr2[2] = 81.;
  arr2[3] = 2.;
  arr2[4] = 8.;

  cudaMemcpy(darr,  arr,  N*sizeof(double), cudaMemcpyHostToDevice);
  cudaMemcpy(darr2, arr2, N*sizeof(double), cudaMemcpyHostToDevice);

  // thrust
  thrust::device_ptr<double> devdarr(darr);
  thrust::device_ptr<double> devdarr2(darr2);

  thrust::transform(devdarr, devdarr+N, devdarr2, devdarr2, thrust::maximum<double>());

  double *res;
  res = new double[N];

  thrust::copy(devdarr2,devdarr2+N,res);

  print_vector(res,N);

  // free
  delete [] arr;
  delete [] arr2;
  delete [] res;
  cudaFree(darr);
  cudaFree(darr2);

  return 0;
}

我认为上面的代码很好,但有点担心

devdarr
,和
devdarr+N
thrust::transform
中使用,本来应该是
devdarr.begin()
devdarr.end()
(但
devdarr
没有.begin() 和 .end()).

在某些时候,我记得我应该小心,有时记忆可能不是连续的形式。

如果

N
小,计算机分配连续内存没有问题。但是如果
N
太大以至于没有剩余的连续内存怎么办?然后,代码将终止给出错误消息,或者以某种方式用一些分布式内存来处理它(然后使用
devdarr+N
作为
devdarr.end()
会有一些麻烦)?

c++ c cuda thrust
© www.soinside.com 2019 - 2024. All rights reserved.