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)。
我是 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)。