0

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

谢谢。

4

1 回答 1

1

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

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

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

最后,由于您只处理 cpp 代码,因此您应该放弃 extern "C"。

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

于 2013-01-01T10:08:57.847 回答