| 1520 | //////////////////////////////////////////////////////////////////////////////// |
| 1521 | |
| 1522 | struct ggml_context * ggml_init(struct ggml_init_params params) { |
| 1523 | static bool is_first_call = true; |
| 1524 | |
| 1525 | ggml_critical_section_start(); |
| 1526 | |
| 1527 | if (is_first_call) { |
| 1528 | // initialize time system (required on Windows) |
| 1529 | ggml_time_init(); |
| 1530 | |
| 1531 | is_first_call = false; |
| 1532 | } |
| 1533 | |
| 1534 | ggml_critical_section_end(); |
| 1535 | |
| 1536 | struct ggml_context * ctx = GGML_MALLOC(sizeof(struct ggml_context)); |
| 1537 | |
| 1538 | // allow to call ggml_init with 0 size |
| 1539 | if (params.mem_size == 0) { |
| 1540 | params.mem_size = GGML_MEM_ALIGN; |
| 1541 | } |
| 1542 | |
| 1543 | const size_t mem_size = params.mem_buffer ? params.mem_size : GGML_PAD(params.mem_size, GGML_MEM_ALIGN); |
| 1544 | |
| 1545 | *ctx = (struct ggml_context) { |
| 1546 | /*.mem_size =*/ mem_size, |
| 1547 | /*.mem_buffer =*/ params.mem_buffer ? params.mem_buffer : ggml_aligned_malloc(mem_size), |
| 1548 | /*.mem_buffer_owned =*/ params.mem_buffer ? false : true, |
| 1549 | /*.no_alloc =*/ params.no_alloc, |
| 1550 | /*.n_objects =*/ 0, |
| 1551 | /*.objects_begin =*/ NULL, |
| 1552 | /*.objects_end =*/ NULL, |
| 1553 | }; |
| 1554 | |
| 1555 | GGML_ASSERT(ctx->mem_buffer != NULL); |
| 1556 | |
| 1557 | GGML_ASSERT_ALIGNED(ctx->mem_buffer); |
| 1558 | |
| 1559 | GGML_PRINT_DEBUG("%s: context initialized\n", __func__); |
| 1560 | |
| 1561 | return ctx; |
| 1562 | } |
| 1563 | |
| 1564 | void ggml_reset(struct ggml_context * ctx) { |
| 1565 | if (ctx == NULL) { |