OpenCL Android矩阵乘法内存不足(mmap fail errno 12)

时间:2015-11-20 07:30:03

标签: 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 (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_OUT_OF_HOST_MEMORY

2 个答案:

答案 0 :(得分:0)

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

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 );

注意:记得释放clBuffer后释放mem_ptr

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

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

答案 1 :(得分:0)

我的mainactivity.java中的一个参数(NumColsB)很短。