在CUDA中操作阵列是否需要分配内存?

在CUDA中操作阵列是否需要分配内存?,c,parallel-processing,cuda,C,Parallel Processing,Cuda,我见过CUDA程序,您在设备上分配内存,对其进行操作,然后将其复制回主机,如下所示: float* h_a = (float*) malloc(numBytes); float* d_a = 0; cudaMalloc((void**) &a, numBytes); cuda_function<<< N/blockSize, blockSize>>>(d_a); cudaMemcpy(d_a, h_a, numBytes, cudaMemcpyDevi

我见过CUDA程序,您在设备上分配内存,对其进行操作,然后将其复制回主机,如下所示:

float* h_a = (float*) malloc(numBytes);
float* d_a = 0;
cudaMalloc((void**) &a, numBytes);
cuda_function<<< N/blockSize, blockSize>>>(d_a);
cudaMemcpy(d_a, h_a, numBytes, cudaMemcpyDeviceToHost);
__global__ void cuda_function(int* a)
{
  ...<operate on a>...
}

int main()
{
  cuda_function<<<N/256, 256>>>(a)
}
float*h_a=(float*)malloc(numBytes);
浮点数*d_a=0;
Cudamaloc((void**)和a,numBytes);
cuda_功能>(d_a);
cudaMemcpy(d_a,h_a,numBytes,cudaMemcpyDeviceToHost);
但我也看到了CUDA程序只在引用被传递给它的内存上运行的代码,如下所示:

float* h_a = (float*) malloc(numBytes);
float* d_a = 0;
cudaMalloc((void**) &a, numBytes);
cuda_function<<< N/blockSize, blockSize>>>(d_a);
cudaMemcpy(d_a, h_a, numBytes, cudaMemcpyDeviceToHost);
__global__ void cuda_function(int* a)
{
  ...<operate on a>...
}

int main()
{
  cuda_function<<<N/256, 256>>>(a)
}
\uuuuuu全局\uuuuuuu无效cuda\u函数(int*a)
{
......
}
int main()
{
cuda_函数(a)
}
这两种方法有什么不同


谢谢

无论发生什么情况,都必须在设备上分配内存。您可以使用类似于
cudamaloc
的工具直接管理内存,也可以使用
cudamalocmanaged
为您管理内存

在第一种方法中,您必须使用
cudaMemcpy
将内存复制到设备或从设备复制内存。然后将指向设备内存的指针(由
cudamaloc
提供)作为参数传递给内核

第二种方法使用统一内存,您不必手动将数据移动到GPU或从GPU移动数据。当它被访问时,它将被分页到GPU或从GPU(并发访问有一些细微差别,但这是另一个时间的讨论)。您仍然需要向内核传递一个指针,指向使用
cudamalocmanaged
分配的托管内存块

我所知道的是,不可能只传递一个指向内核的指针并对备份数据进行操作


希望这有帮助