DM8147 memory 研究 HeapBuf_Handle_upCast HeapMem_Handle_upCast



DM8147memory研究

========memory.c========

    此示例演示如何使用xdc.runtime.Memory模块和不同的xdc.runtime.IHeap实现来管理内存。一个系统堆是静态使用ti.sysbios.heaps.HeapMem创建。这堆插入xdc.runtime.memorydefaultHeapInstance。此测试用例使用了两个任务。一个任务是创建静态和一个是动态创建的。这两个任务使用xdc.runtime.Memory分配内存,但使用不同的创建堆使用不同IHEAP实现。任务0使用ti.sysbios.heaps.HeapBuf静态创建其堆(task0Heap),因为在任务0分配是一个固定的大小。任务1使用ti.sysbios.heaps.HeapMem静态地创建其堆(task1Heap),因为任务1分配可变块大小。这两个任务之前和之后分配其打印堆状态。

* This example shows the use ofxdc.runtime.Memory module and different

 * xdc.runtime.IHeap implementations to manage memory.

 * Asystem heap is created statically using ti.sysbios.heaps.HeapMem.

 * Thisheap is plugged into xdc.runtime.memory as the defaultHeapInstance.

 * Thistestcase uses two tasks. One task is statically created and one

 * isdynamically created. Both tasks use xdc.runtime.Memory to allocate

 * memory but use different heaps created using different IHeap

 * implementations.

 * Task0uses ti.sysbios.heaps.HeapBuf to statically

 * create its heap (task0Heap) because the allocations in task0 are of

 * afixed size.

 * Task1uses ti.sysbios.heaps.HeapMem to statically create its heap

 * (task1Heap) because task1 allocates variable block sizes.

 * Bothtasks print their heap status before and after allocations.

 

#include<xdc/std.h>

#include <xdc/runtime/IHeap.h>

#include<xdc/runtime/System.h>

#include <xdc/runtime/Memory.h>

#include<ti/sysbios/BIOS.h>

#include<ti/sysbios/knl/Task.h>

#include <ti/sysbios/heaps/HeapBuf.h>

#include <ti/sysbios/heaps/HeapMem.h>

#include<xdc/cfg/global.h>

 

#defineTASK0BUFSIZE   32      /* size of allocations */

#defineTASK0NUMBUFS   2       /* number of buffers */

 

#defineTASK1BUFSIZE0  128     /* size of allocation */

#defineTASK1BUFSIZE1  64      /* size of allocation */

#defineTASK1BUFSIZE2  32      /* size of allocation */

#defineTASK1BUFSIZE3  16      /* size of allocation */

#defineTASK1NUMBUFS   4       /* number of buffers */

 

Voidtask0Fxn(UArg arg0, UArg arg1);

Voidtask1Fxn(UArg arg0, UArg arg1);

Voididl0Fxn();

/* Function to print heap statistics */

static Void printHeapStats(IHeap_Handle heap);

Int main()

{

   Task_create(task1Fxn, NULL, NULL);

       System_printf("Memoryexample started.\n");

   BIOS_start();   /* does notreturn */

   return(0);

}


/*task0Fxn*/

Voidtask0Fxn(UArgarg0, UArg arg1)

{

   Int i;

   Ptr bufs[TASK0NUMBUFS];

   IHeap_Handle heap =HeapBuf_Handle_upCast(task0Heap);

       System_printf("Initialtask0 heap status\n");

   /* print initialtask0heap status */

   printHeapStats(heap);

   /* allocate blocks from task0Heap */

   for (i = 0; i < TASK0NUMBUFS; i++) {

       bufs[i] = Memory_alloc(heap, TASK0BUFSIZE, 0, NULL);

   }

   /* free memory blocks */

   for (i = 0; i < TASK0NUMBUFS; i++) {

       Memory_free(heap, bufs[i], TASK0BUFSIZE);

   }

   System_printf("Final task0 heap status\n");

   /* print task0Heapstatus */

   printHeapStats(heap);

       System_printf("Task0Complete\n");

}

/*task1Fxn*/

Voidtask1Fxn(UArgarg0, UArg arg1)

{

   Ptr bufs[TASK1NUMBUFS];

   IHeap_Handle heap =HeapMem_Handle_upCast(task1Heap);

       System_printf("Initialtask1 heap status\n");

   /* print initialtask1Heap status */

   printHeapStats(heap);

   bufs[0] = Memory_alloc(heap, TASK1BUFSIZE0, 0, NULL);

   bufs[1] = Memory_alloc(heap, TASK1BUFSIZE1, 0, NULL);

   bufs[2] = Memory_alloc(heap, TASK1BUFSIZE2, 0, NULL);

   Memory_free(heap, bufs[1], TASK1BUFSIZE1);

   Memory_free(heap, bufs[2], TASK1BUFSIZE2);

   bufs[3] = Memory_alloc(heap, TASK1BUFSIZE3, 0, NULL);   

   Memory_free(heap, bufs[0], TASK1BUFSIZE0);

   Memory_free(heap, bufs[3], TASK1BUFSIZE3);   

       System_printf("Finaltask1 heap status\n");

   /* print task1Heapstatus */

   printHeapStats(heap);

       System_printf("Task1Complete\n");

}

staticVoid printHeapStats(IHeap_Handle heap)

{

   Memory_Stats stats;

   Memory_getStats(heap, &stats);

#ifdefxdc_target__isaCompatible_28

   System_printf("largestFreeSize =%ld\n", (ULong)stats.largestFreeSize);

   System_printf("totalFreeSize =%ld\n", (ULong)stats.totalFreeSize);

   System_printf("totalSize =%ld\n", (ULong)stats.totalSize);

#else   

   System_printf("largestFreeSize =%d\n", stats.largestFreeSize);

   System_printf("totalFreeSize = %d\n",stats.totalFreeSize);

   System_printf("totalSize = %d\n",stats.totalSize);

#endif

}

/*idl0Fxn*/

Void idl0Fxn()

{

   BIOS_exit(0);

}


csc_matrix是SciPy中的一个稀疏矩阵格式,它使用压缩列存储格式(Compressed Sparse Column)来表示稀疏矩阵。下面是csc_matrix包的源码: ```python class csc_matrix(spmatrix): def __init__(self, arg1, shape=None, dtype=None, copy=False): _data_matrix.__init__(self) if isspmatrix_csc(arg1): if issubclass(arg1.__class__, self.__class__) and copy: arg1 = arg1.copy() self._set_self(arg1) return if dtype is None: dtype = getdtype(float, arg1) from .coo import coo_matrix if isspmatrix(arg1): if shape is None: shape = arg1.shape self._set_self(self.__class__((arg1.data, arg1.indices, arg1.indptr), shape=shape, dtype=dtype, copy=copy)) return if shape is None: try: shape = arg1.shape except AttributeError: raise TypeError('expected dimension') if isintlike(arg1): n = int(arg1) self._shape = (n,n) self._check() return if isshape(arg1): self._shape = tuple(arg1) self._check() return # Now we must have something that we can convert to a csc_matrix # First convert to coo try: arg1 = coo_matrix(arg1, dtype=dtype).tocsc() except TypeError: raise ValueError("unrecognized format: {!r}".format(arg1)) self._set_self(arg1) def _get_row_slice(self, i, cslice): if i < 0: M,N = self.shape i += M if cslice.step not in (1, None): raise ValueError('slicing with step != 1 not supported') start, stop = cslice.start, cslice.stop if start is None: start = 0 if stop is None: stop = self.shape[1] if i < 0 or i >= self.shape[0]: raise IndexError('index out of bounds') if stop <= start: return array(self.dtype) indptr = self.indptr indices = self.indices startptr, stopptr = indptr[i], indptr[i+1] start_idx = searchsorted(indices[startptr:stopptr], start) stop_idx = searchsorted(indices[startptr:stopptr], stop) if indices[startptr+stop_idx-1] != stop: stop_idx = stop_idx - 1 num_indices = stop_idx - start_idx if num_indices == 0: return array(self.dtype) idx_dtype = get_index_dtype((indices, indptr), maxval=max(self.shape)) row_data = np.empty(num_indices, dtype=self.dtype) row_indices = np.empty(num_indices, dtype=idx_dtype) row_data[:] = self.data[startptr+start_idx: startptr+stop_idx] row_indices[:] = indices[startptr+start_idx:startptr+stop_idx] return csc_matrix((row_data, row_indices, np.array([0, num_indices], dtype=idx_dtype)), shape=(1, stop-start), dtype=self.dtype) def _get_col_slice(self, j, rslice): if j < 0: M,N = self.shape j += N if rslice.step not in (1, None): raise ValueError('slicing with step != 1 not supported') start, stop = rslice.start, rslice.stop if start is None: start = 0 if stop is None: stop = self.shape[0] if j < 0 or j >= self.shape[1]: raise IndexError('index out of bounds') if stop <= start: return array(self.dtype) indptr = self.indptr indices = self.indices data = self.data i0 = searchsorted(indptr, j, side='left') i1 = searchsorted(indptr, j+1, side='left') idx_dtype = get_index_dtype((indices, indptr), maxval=self.shape[0]) row_indices = np.empty(i1-i0, dtype=idx_dtype) row_data = np.empty(i1-i0, dtype=self.dtype) row_indices = indices[i0:i1] row_data = data[i0:i1] mask = (row_indices >= start) & (row_indices < stop) row_indices = row_indices[mask] - start return csc_matrix((row_data[mask], row_indices, np.array([0,len(row_indices)], dtype=idx_dtype)), shape=(stop-start, 1), dtype=self.dtype) def _mul_scalar(self, other): return self.__class__((self.data * other, self.indices.copy(), self.indptr.copy()), shape=self.shape, dtype=self.dtype) def _mul_vector(self, other): M, N = self.shape if other.shape != (N,): raise ValueError("dimension mismatch") result = np.zeros(M, dtype=upcast_char(self.dtype.char, other.dtype.char)) fn = getattr(_sparsetools, self.format + '_vec_mul') fn(M, N, self.indptr, self.indices, self.data, other, result) return result def _mul_multimatrix(self, other): M, K = self.shape _, N = other.shape result = spmatrix(dtype=self.dtype, shape=(M,N)) o_data = other.data if isspmatrix(other): fn = getattr(_sparsetools, self.format + '_matmat_pass1') fn(M, K, N, self.indptr, self.indices, other.indptr, other.indices, o_data) fn = getattr(_sparsetools, self.format + '_matmat_pass2') fn(M, K, N, self.indptr, self.indices, self.data, other.indptr, other.indices, o_data, result.indptr, result.indices) else: fn = getattr(_sparsetools, self.format + '_matvec') for j in range(N): fn(M, K, self.indptr, self.indices, self.data, o_data[:,j], result.data, j) result.sum_duplicates() return result def _get_dense(self, i, j): # Short-circuit zero case if self.nnz == 0: return np.zeros(self.shape, dtype=self.dtype)[i, j] M, N = self.shape if i < 0: i += M if j < 0: j += N if i < 0 or i >= M or j < 0 or j >= N: raise IndexError("index out of bounds") indptr = self.indptr indices = self.indices data = self.data i0 = indptr[j] i1 = indptr[j+1] if i0 == i1: return 0 idx = searchsorted(indices[i0:i1], i) + i0 if idx == i1 or indices[idx] != i: return 0 return data[idx] def _get_sparse(self, i, j): from . import lil_matrix M, N = self.shape if i < 0: i += M if j < 0: j += N if i < 0 or i >= M or j < 0 or j >= N: raise IndexError("index out of bounds") indptr = self.indptr indices = self.indices i0 = indptr[j] i1 = indptr[j+1] data = self.data[i0:i1] indices = indices[i0:i1] indptr = np.array([0, len(data)], dtype=idx_dtype) return lil_matrix((data, indices, indptr), shape=(1, N)) def __eq__(self, other): return self._eq_dense(other) def diagonal(self, k=0): if self.shape[0] != self.shape[1]: raise ValueError("diagonal is only defined for square matrices") if k > 0: n = self.shape[1] - k indptr = self.indptr[k:] indices = self.indices[indptr[0]:indptr[-1]] data = self.data[indptr[0]:indptr[-1]] else: n = self.shape[0] + k indptr = self.indptr[:n+1] indices = self.indices[indptr[0]:indptr[-1]] data = self.data[indptr[0]:indptr[-1]] return csc_matrix((data, indices, indptr), shape=(n,n)) def sum(self, axis=None, dtype=None, out=None): if dtype is not None and not np.issubdtype(dtype, self.dtype): raise TypeError('Cannot upcast [%s] to [%s].' % (self.dtype, dtype)) if axis is None: return np.asarray(self.data.sum(dtype=dtype), dtype=dtype) elif axis == 0: if out is not None: raise ValueError("output array specified for reductions along axis 0,\ but unsupported for csc_matrix") ret = np.empty(self.shape[1], dtype=dtype) for i in range(self.shape[1]): ret[i] = self.getcol(i).sum(dtype=dtype) return ret elif axis == 1: if out is not None: raise ValueError("output array specified for reductions along axis 1,\ but unsupported for csc_matrix") ret = np.empty(self.shape[0], dtype=dtype) for i in range(self.shape[0]): ret[i] = self.getrow(i).sum(dtype=dtype) return ret else: raise ValueError("axis out of bounds") ``` csc_matrix的实现主要基于COO格式,因为COO格式在行和列的切片操作上比较高效。除此之外,该源代码还实现了csc_matrix的加、减、乘、除、取负、转置、切片、求逆、求行列式、求特征值和特征向量等方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值