LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
tensor3_storage.c
浏览该文件的文档.
1
5#include "memory_bridge.h"
7#include "lmmc/tensor_nd.h"
8
9lmmc_status_t lmmc_tensor3_create(size_t dim0, size_t dim1, size_t dim2, lmmc_tensor3_t* out_tensor) {
10 lmmc_tensor_nd_t nd = {0};
11 size_t dims[3];
13
14 if (out_tensor == NULL || dim0 == 0 || dim1 == 0 || dim2 == 0) {
16 }
17
18 dims[0] = dim0;
19 dims[1] = dim1;
20 dims[2] = dim2;
21 st = lmmc_tensor_nd_create(3, dims, &nd);
22 if (st != LMMC_STATUS_OK) {
23 return st;
24 }
25
26 out_tensor->dim0 = nd.dims[0];
27 out_tensor->dim1 = nd.dims[1];
28 out_tensor->dim2 = nd.dims[2];
29 out_tensor->stride0 = nd.strides[0];
30 out_tensor->stride1 = nd.strides[1];
31 out_tensor->stride2 = nd.strides[2];
32 out_tensor->data = nd.data;
33 out_tensor->owns_data = nd.owns_data;
34 return LMMC_STATUS_OK;
35}
36
38 size_t dim0,
39 size_t dim1,
40 size_t dim2,
41 size_t stride0,
42 size_t stride1,
43 size_t stride2,
44 lmmc_real_t* data,
45 lmmc_tensor3_t* out_tensor
46) {
47 lmmc_tensor3_t candidate = {0};
48 if (out_tensor == NULL || data == NULL || dim0 == 0 || dim1 == 0 || dim2 == 0) {
50 }
51 if (stride0 == 0 || stride1 == 0 || stride2 == 0) {
53 }
54
55 candidate.dim0 = dim0;
56 candidate.dim1 = dim1;
57 candidate.dim2 = dim2;
58 candidate.stride0 = stride0;
59 candidate.stride1 = stride1;
60 candidate.stride2 = stride2;
61 candidate.data = data;
62 candidate.owns_data = 0;
63
64 if (lmmc_tensor3_validate(&candidate) != LMMC_STATUS_OK) {
66 }
67
68 *out_tensor = candidate;
69 return LMMC_STATUS_OK;
70}
71
73 if (tensor == NULL) {
74 return;
75 }
76 if (tensor->owns_data && tensor->data != NULL) {
77 size_t total = 0;
78 size_t total_part = 0;
79 if (lmmc_safe_mul_size(tensor->dim0, tensor->dim1, &total_part) &&
80 lmmc_safe_mul_size(total_part, tensor->dim2, &total)) {
81 for (size_t i = 0; i < total; ++i) {
82 LMMC_REAL_CLEAR(&tensor->data[i]);
83 }
84 }
85 lmmc_memory_free(tensor->data);
86 }
87 tensor->dim0 = 0;
88 tensor->dim1 = 0;
89 tensor->dim2 = 0;
90 tensor->stride0 = 0;
91 tensor->stride1 = 0;
92 tensor->stride2 = 0;
93 tensor->data = NULL;
94 tensor->owns_data = 0;
95}
96
98 lmmc_tensor3_t* tensor, size_t i, size_t j, size_t k,
99 lmmc_real_t value)
100{
101 if (lmmc_tensor3_validate(tensor) != LMMC_STATUS_OK) {
103 }
104 if (i >= tensor->dim0 || j >= tensor->dim1 || k >= tensor->dim2) {
106 }
107 const size_t offset =
108 i * tensor->stride0 + j * tensor->stride1 + k * tensor->stride2;
109 LMMC_REAL_SET(&tensor->data[offset], &value);
110 return LMMC_STATUS_OK;
111}
112
114 const lmmc_tensor3_t* tensor, size_t i, size_t j, size_t k,
115 lmmc_real_t* out_value)
116{
117 if (lmmc_tensor3_validate(tensor) != LMMC_STATUS_OK ||
118 out_value == NULL) {
120 }
121 if (i >= tensor->dim0 || j >= tensor->dim1 || k >= tensor->dim2) {
123 }
124 const size_t offset =
125 i * tensor->stride0 + j * tensor->stride1 + k * tensor->stride2;
126 LMMC_REAL_SET(out_value, &tensor->data[offset]);
127 return LMMC_STATUS_OK;
128}
#define LMMC_REAL_CLEAR(x)
释放一个 lmmc_real_t 变量(POD 类型为空操作)。
double lmmc_real_t
Public and internal LMMC real type.
#define LMMC_REAL_SET(dst, src)
将一个 lmmc_real_t 赋值到另一个:*dst = *src 。
void lmmc_memory_free(void *pointer)
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_OK
@ LMMC_STATUS_INVALID_ARGUMENT
lmmc_status_t lmmc_tensor3_get(const lmmc_tensor3_t *tensor, size_t i, size_t j, size_t k, lmmc_real_t *out_value)
读取元素 (i,j,k)。
void lmmc_tensor3_destroy(lmmc_tensor3_t *tensor)
销毁张量。
lmmc_status_t lmmc_tensor3_create(size_t dim0, size_t dim1, size_t dim2, lmmc_tensor3_t *out_tensor)
创建 dim0 x dim1 x dim2 的张量,元素未初始化。
lmmc_status_t lmmc_tensor3_wrap(size_t dim0, size_t dim1, size_t dim2, size_t stride0, size_t stride1, size_t stride2, lmmc_real_t *data, lmmc_tensor3_t *out_tensor)
用外部缓冲区构造张量视图。
lmmc_status_t lmmc_tensor3_set(lmmc_tensor3_t *tensor, size_t i, size_t j, size_t k, lmmc_real_t value)
写入元素 (i,j,k)。
lmmc_real_t * data
三阶张量结构。
三阶张量描述符的公共检查。
N-D 稠密张量数据结构、收缩与视图.
lmmc_real_t * data
lmmc_status_t lmmc_tensor_nd_create(size_t ndim, const size_t *dims, lmmc_tensor_nd_t *out)
创建 N-D 张量,行优先连续存储,元素初始化为零.
size_t dims[LMMC_TENSOR_MAX_NDIM]
size_t strides[LMMC_TENSOR_MAX_NDIM]
N-D 张量结构.