我有一个问题。我正在使用 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/