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

OpenCL Android Matrix Multiplication Out of memory (mmap fail errno 12)

我是 Android、JNI 和 OpenCL 的新手。我正在努力将 java 矩阵传递给本机,执行 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

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

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

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