我正在尝试比较
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()
会有一些麻烦)?