OpenCL Android矩阵乘法内存不足(mmap失败错误号12)

OpenCL Android矩阵乘法内存不足(mmap失败错误号12),android,matrix,opencl,mmap,multiplication,Android,Matrix,Opencl,Mmap,Multiplication,我是Android、JNI和OpenCL的新手。我正在将java矩阵传递给native,执行OpenCL矩阵乘法,并将结果数组传递回java(在android中使用Adreno 330) 我的代码基本上是基于adreno sdk示例构建的,它可以编译,但创建设备缓冲区时似乎内存不足 // First matrix (device) cl_mem matrixA; // Second Matrix (device) cl_mem matrixB; // Matrix product result

我是Android、JNI和OpenCL的新手。我正在将java矩阵传递给native,执行OpenCL矩阵乘法,并将结果数组传递回java(在android中使用Adreno 330)

我的代码基本上是基于adreno sdk示例构建的,它可以编译,但创建设备缓冲区时似乎内存不足

// First matrix (device)
cl_mem matrixA;
// Second Matrix (device)
cl_mem matrixB;
// Matrix product result (device)
cl_mem matrixProduct;

// Cast parameters
NumRowsA = (size_t)NumRowsA;  // 2
NumColsARowsB = (size_t)NumColsARowsB; // 2
NumColsB = (size_t)NumColsB; // 2
size_t NumFloatsA = NumRowsA * NumColsARowsB;
size_t NumFloatsB = NumColsB * NumColsARowsB;


// Create device buffers
matrixA = clCreateBuffer( openCLObjects.context,
        CL_MEM_READ_ONLY,
        NumFloatsA * sizeof(cl_float),
        NULL,
        &err );

// ERROR OCCURS BELOW
// mmap fail (pid 21957, tid 21957, size 2155245568, flags 0x1, errno 12 (Out of Memory)

matrixB = clCreateBuffer( openCLObjects.context,
        CL_MEM_READ_ONLY,
        NumFloatsB * sizeof(cl_float),
        NULL,
        &err );
我现在只通过2x2矩阵。调试时,NumFloatsB*sizeof(cl_float)=16。在此之前,我没有在GPU上分配任何内存


OPENCL错误代码:CL_主机内存不足似乎是驱动程序问题,您可以尝试以下方法解决此问题:

1) 使用主机上分配的内存备份clBuffer:

void *mem_ptr = malloc(NumFloatsA * sizeof(cl_float));
matrixA = clCreateBuffer( openCLObjects.context,
        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
        NumFloatsA * sizeof(cl_float),
        mem_ptr,
        &err );
matrixA = clCreateBuffer( openCLObjects.context,
        CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR,
        NumFloatsA * sizeof(cl_float),
        NULL,
        &err );
(注意:请记住在释放clBuffer后释放mem_ptr)

2) 强制驱动程序在主机上分配内存:

void *mem_ptr = malloc(NumFloatsA * sizeof(cl_float));
matrixA = clCreateBuffer( openCLObjects.context,
        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
        NumFloatsA * sizeof(cl_float),
        mem_ptr,
        &err );
matrixA = clCreateBuffer( openCLObjects.context,
        CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR,
        NumFloatsA * sizeof(cl_float),
        NULL,
        &err );

似乎是驱动程序问题,您可以尝试以下方法来解决此问题:

1) 使用主机上分配的内存备份clBuffer:

void *mem_ptr = malloc(NumFloatsA * sizeof(cl_float));
matrixA = clCreateBuffer( openCLObjects.context,
        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
        NumFloatsA * sizeof(cl_float),
        mem_ptr,
        &err );
matrixA = clCreateBuffer( openCLObjects.context,
        CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR,
        NumFloatsA * sizeof(cl_float),
        NULL,
        &err );
(注意:请记住在释放clBuffer后释放mem_ptr)

2) 强制驱动程序在主机上分配内存:

void *mem_ptr = malloc(NumFloatsA * sizeof(cl_float));
matrixA = clCreateBuffer( openCLObjects.context,
        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
        NumFloatsA * sizeof(cl_float),
        mem_ptr,
        &err );
matrixA = clCreateBuffer( openCLObjects.context,
        CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR,
        NumFloatsA * sizeof(cl_float),
        NULL,
        &err );

我在mainactivity.java中缺少一个参数(NumColsB)。

我在mainactivity.java中缺少一个参数(NumColsB)。

看起来像是驱动程序错误。你能提供设备+安卓版本吗?HTC One M8安卓5.0.1看起来像是驱动程序错误。你能提供设备+安卓版本吗?HTC One M8安卓5.0.1你会遇到什么样的错误?还是记忆犹新?malloc是否返回有效指针或NULL?我得到的错误与以前相同。没有变化,没有记忆。Malloc似乎返回了一个有效的指针。您会遇到什么样的错误?还是记忆犹新?malloc是否返回有效指针或NULL?我得到的错误与以前相同。没有变化,没有记忆。Malloc似乎返回了一个有效的指针。