我是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
答案 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)很短。