gpt4 book ai didi

c - OpenCL 程序使用太多内存

转载 作者:太空宇宙 更新时间:2023-11-04 04:28:52 25 4
gpt4 key购买 nike

我已经使用 OpenCL 成功实现了数字下变频器。在实现插值部分时,我只能将最大因子设置为 146。任何更多都会导致程序崩溃并抛出错误代码 CL_INVALID_MEM_OBJECT -38

对于那些不知道的人来说,插值是一种在已知数据点范围内构造新数据点的方法。 DDC(即数字下变频器)用于提高或降低采样率,同时尝试使用重建滤波器重建数据点。

请注意,我使用的文件是一个 1.75Mb 的 wav 文件作为输入。它以 44100 采样,我的目标是使其以 48000(蓝光质量)采样。这导致 Interpolation/Decimate 因子为 160/147。但是任何超过 146 的插值因子都会使驱动程序崩溃,并且会抛出 -38 的程序和错误,如上所示。

我认为问题出在我创建 cl_mem 缓冲区的地方。我有大约 7 个,这里是它们的初始化和使用方式。假设 P 为 3,Q 为 2,而 num_items 为 918222 个样本:

input = clCreateBuffer(
context,
CL_MEM_READ_ONLY,
num_items * sizeof(float),
NULL,
&status);

output = clCreateBuffer(
context,
CL_MEM_WRITE_ONLY,
num_items * P * sizeof(float),
NULL,
&status);

//Lowpass kernel parameters
inputForLowpass = clCreateBuffer(
context,
CL_MEM_READ_ONLY,
num_items * P * sizeof(float),
NULL,
&status);

outputFromLowpass = clCreateBuffer(
context,
CL_MEM_READ_ONLY,
num_items * P * sizeof(float),
NULL,
&status);

//Decimate kernel parameters
inputForDecimate = clCreateBuffer(
context,
CL_MEM_READ_ONLY,
num_items * P * sizeof(float),
NULL,
&status);

outputFromDecimate = clCreateBuffer(
context,
CL_MEM_READ_ONLY,
(int)(num_items * (P*1.0 / Q) * sizeof(float)),
NULL,
&status);

//numOfCoefficients for number of taps
coeff = clCreateBuffer(
context,
CL_MEM_READ_ONLY,
numOfCoefficients * sizeof(float),
NULL,
&status);

我使用 Visual Studio 中的内存调试器发现该程序使用了 602Mb(在它崩溃之前插值因子为 160。它使用了大约 120Mb,插值因子为 3,仍然很多!)我怎样才能降低它?我是否以不正确的方式使用缓冲区?

除此之外,我在主机代码中还有其他三个内存分配。 “Array”仅保存 wav 文件中的值,而 OutputData 和 OutputData2 分别存储来自过滤输入和抽取输入的值。

Array = (float*)malloc(num_items * sizeof(float));
OutputData = (float*)malloc(num_items * P * sizeof(float));
OutputData2 = (float*)malloc((int)(num_items * (P*1.0 / Q) * sizeof(float)));

下图是 P=3(数组大小增加 3)时 Visual Studio 中的内存使用情况。

enter image description here

这是我获得 -38 代码的 writeBuffers 之一。

status = clEnqueueWriteBuffer(
cmdQueue,
inputForLowpass,
CL_FALSE,
0,
num_items * P * sizeof(float),
OutputData,
0,
NULL,
NULL);
printf("Input enqueueWriteBuffer for Lowpass Kernel status: %i \n", status);

这是低通内核:

__kernel void lowpass(__global float *Array, __global float *coefficients, __global float *Output, __const int numOfCoefficients) {

int globalId = get_global_id(0);
float sum=0.0f;
int min_i= max((numOfCoefficients-1),globalId)-(numOfCoefficients-1);
int max_i= min_i+numOfCoefficients;
for (int i=min_i; i< max_i; i++)
{
sum +=Array[i]*coefficients[globalId-i];
}
//sum = min(., (0.999969482421875));
//sum = max(sum, -1.0f);
Output[globalId]=sum;

编辑发生错误是因为我分配的缓冲区大小已使用超过 512Mb 的内存。那是我可以拥有的最大缓冲区大小。为了解决这个问题,我必须在我的代码中实现某种内存管理系统。也许一次使用 8Mb 缓冲区。

最佳答案

您的内存对象没有任何明确支持,这可能是您的问题。我建议从

添加一个标志

https://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html

例如 CL_MEM_USE_HOST_PTRCL_MEM_COPY_HOST_PTRCL_MEM_ALLOC_HOST_PTR,然后指定主机指针。如果您使用 CL_MEM_USE_HOST_PTR,如果缓冲区位于主机内存中,则不会在主机上再次分配缓冲区,如果它只是内存使用情况,可能会帮助您解决问题。

关于c - OpenCL 程序使用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38644403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com