我怎样才能克服cuda中的内存分配

时间:2013-01-01 10:02:45

标签: c++ c memory-management cuda

我有一个问题。我正在使用4.0 cuda。 我有以下代码:

在我的cudaHeader.h中:

#include <stdlib.h>

extern "C" void wrapperfunction(int* array);

在我的cudaCpp.cpp中:

#include <stdio.h>
......
int main()
{
  int array[50] = {0, 1, 2, ..........,49};
  ...........

  while(true)
  {
   ........

   wrapperfunction(array);

   ........

   }
  return 0;

}

在我的cuda.CU中:

__global__ void kernel(int *new_arrayG, int *arrayG,int *const_arrayG)
{
  int x = threadIdx.x;

  new_arrayG[x] = arrayG[x] + const_arrayG[x];
  __syncthreads();
}

extern "C" int wrapperfunction(int* array)
{

  static int const_array[50] = {0, 1, 2, ........., 49};  //any constant data
  int *arrayG, *new_arrayG, *const_arrayG;
  int size = 50 * sizeof(int);

  cudaMalloc((void**)&arrayG, size);
  cudaMalloc((void**)&new_arrayG, size);
  cudaMalloc((void**)&const_arrayG, size);

  cudaMemcpy(const_arrayG, const_array, size, cudaMemcpyHostToDevice);
  cudaMemcpy(arrayG, array, size, cudaMemcpyHostToDevice);

  Kernel<<<1, 50>>>(new_arrayG, arrayG, const_arrayG);

  cudaMemcpy(array, new_arrayG, size, cudaMemcpyDeviceToHost);

  cudaFree(arrayG);cudaFree(new_arrayG);cudaFree(const_arrayG);
}

这是我的代码中的一个示例,我想说每次我从我的.cpp代码调用包装函数时,程序会分配静态数组并在结束时释放它并且它需要花费很多时间并且实际上我处理非常大型静态数组,每次调用此函数我都需要花费很多时间。所以我想在程序开始时一次分配我的静态数组,并在我的程序(应用程序)结束时释放它们。 PLZ。任何帮助。

感谢。

1 个答案:

答案 0 :(得分:1)

只需在main()中为所有数组分配一次数组,然后将其移动到某个.cu文件中。然后将它们的地址传递给包装函数。

另外,你应该检查这些电话的回复。

此外,如果您的C ++标头等效,请尽量不要在C ++程序中使用任何C标头。使用#include <cstdio>代替#include <cstdlib>

最后,由于你只处理cpp代码,你应该放弃你的外部“C”。

或者,如果您确实希望使用CUDA代码中的C代码,请使用.cpp文件扩展名退出。