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コードからwrapperfunctionを呼び出すたびに、プログラムは静的配列を割り当て、最後にそれを解放し、それには多くの時間がかかり、実際には非常に大きな静的配列を扱います.この関数を呼び出すたびに、非常に時間がかかります。そのため、プログラムの開始時に一度静的配列を割り当て、プログラム(アプリケーション)の最後にそれらを解放する方法が必要です。お願いします。どんな助けでも。

ありがとう。

4

1 に答える 1

1

main()内のすべてに配列を1回割り当て、それを.cuファイルに移動するだけです。そして、それらのアドレスをラッピング関数に渡します。

また、そのような呼び出しのリターンを確認する必要があります。

さらに、同等のC ++ヘッダーがある場合は、C++プログラムでCヘッダーを使用しないようにしてください。#include <cstdio>の代わりに使用してください#include <cstdlib>

最後に、cppコードのみを扱っているので、extern"C"を削除する必要があります。

または、CUDAコードからCコードを使用する場合は、.cppファイル拡張子の使用を終了します。

于 2013-01-01T10:08:57.847 に答える