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

标签 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 代码中调用包装函数时,程序都会分配静态数组并在最后释放它,这需要很多时间,实际上我处理得非常好大型静态数组,每次调用此函数我都会花费很多时间。所以我想找到一种方法在程序开始时分配我的静态数组一次,并在我的程序(应用程序)结束时释放它们。 请。任何帮助。

谢谢。

最佳答案

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

此外,您应该检查此类调用的返回。

此外,如果您有等效的 C++ 头文件,请尽量不要在您的 C++ 程序中使用任何 C 头文件。使用 #include <cstdio>而不是 #include <cstdlib> .

最后,因为您只处理 cpp 代码,所以您应该删除 extern "C"。

或者,如果您确实希望在 CUDA 代码之外使用 C 代码,请停止使用 .cpp 文件扩展名。

关于c++ - 我怎样才能克服cuda中的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14109502/

相关文章:

c++ - 如何向包含多部分 HTTP POST 的 SendGrid Web api 发出请求

c++ - 如何使用宏#define 更改类名?

c - 如何在C程序中打印堆栈的内容?

c - 如何制作接受不同类型的函数?

java - 我已经在 Eclipse 中更改了内存大小,但仍然收到 java.lang.OutOfMemoryError

c - 如何将c中的整个文件读入数字数组

c++ - 防止 Hook dll加载

c++ - 无法将 WSPStartup 设置为 dll 导出

选择在 Makefile 中使用哪个 main()

iphone - 我的 iPhone 应用程序使用了多少内存(来自模拟器)