Add README.md documentation for: - Main SDK overview with quick start guides - JavaScript/TypeScript SDK - Python SDK - Go SDK - Rust SDK - Java SDK - Kotlin SDK - Swift SDK - Flutter/Dart SDK - C SDK - C++ SDK - C#/.NET SDK - Ruby SDK Each README includes: - Installation instructions - Quick start examples - Tensor operations - Matrix operations (matmul, conv2d, attention) - LLM inference (single and streaming) - Configuration options - Error handling - Type definitions
258 lines
5.3 KiB
Markdown
258 lines
5.3 KiB
Markdown
# Synor Compute SDK for C
|
|
|
|
Access distributed heterogeneous compute at 90% cost reduction.
|
|
|
|
## Installation
|
|
|
|
### Using CMake
|
|
|
|
```cmake
|
|
find_package(SynorCompute REQUIRED)
|
|
target_link_libraries(your_app PRIVATE synor_compute)
|
|
```
|
|
|
|
### Manual Installation
|
|
|
|
```bash
|
|
git clone https://github.com/synor/compute-sdk-c
|
|
cd compute-sdk-c
|
|
mkdir build && cd build
|
|
cmake ..
|
|
make
|
|
sudo make install
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
```c
|
|
#include <synor_compute.h>
|
|
#include <stdio.h>
|
|
|
|
int main() {
|
|
// Initialize client
|
|
synor_client_t* client = synor_client_create("your-api-key");
|
|
if (!client) {
|
|
fprintf(stderr, "Failed to create client\n");
|
|
return 1;
|
|
}
|
|
|
|
// Create tensors
|
|
size_t shape[] = {512, 512};
|
|
synor_tensor_t* a = synor_tensor_random(shape, 2, SYNOR_FP32);
|
|
synor_tensor_t* b = synor_tensor_random(shape, 2, SYNOR_FP32);
|
|
|
|
// Matrix multiplication on GPU
|
|
synor_matmul_options_t opts = {
|
|
.precision = SYNOR_FP16,
|
|
.processor = SYNOR_PROCESSOR_GPU,
|
|
.priority = SYNOR_PRIORITY_NORMAL
|
|
};
|
|
|
|
synor_result_t* result = synor_matmul(client, a, b, &opts);
|
|
if (result && result->status == SYNOR_STATUS_COMPLETED) {
|
|
printf("Time: %ldms\n", result->execution_time_ms);
|
|
printf("Cost: $%.6f\n", result->cost);
|
|
}
|
|
|
|
// Cleanup
|
|
synor_result_free(result);
|
|
synor_tensor_free(a);
|
|
synor_tensor_free(b);
|
|
synor_client_free(client);
|
|
|
|
return 0;
|
|
}
|
|
```
|
|
|
|
## Tensor Operations
|
|
|
|
```c
|
|
// Create tensors
|
|
size_t shape[] = {3, 3};
|
|
synor_tensor_t* zeros = synor_tensor_zeros(shape, 2, SYNOR_FP32);
|
|
synor_tensor_t* ones = synor_tensor_ones(shape, 2, SYNOR_FP32);
|
|
synor_tensor_t* random = synor_tensor_random(shape, 2, SYNOR_FP32);
|
|
|
|
// From data
|
|
float data[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
|
|
size_t data_shape[] = {2, 3};
|
|
synor_tensor_t* tensor = synor_tensor_create(data, 6, data_shape, 2, SYNOR_FP32);
|
|
|
|
// Get tensor info
|
|
size_t ndim = synor_tensor_ndim(tensor);
|
|
size_t size = synor_tensor_size(tensor);
|
|
const size_t* tensor_shape = synor_tensor_shape(tensor);
|
|
|
|
// Get data pointer
|
|
const float* tensor_data = synor_tensor_data(tensor);
|
|
```
|
|
|
|
## Matrix Operations
|
|
|
|
```c
|
|
// Matrix multiplication
|
|
synor_matmul_options_t matmul_opts = {
|
|
.precision = SYNOR_FP16,
|
|
.processor = SYNOR_PROCESSOR_GPU
|
|
};
|
|
synor_result_t* result = synor_matmul(client, a, b, &matmul_opts);
|
|
|
|
// 2D Convolution
|
|
synor_conv2d_options_t conv_opts = {
|
|
.stride_h = 1, .stride_w = 1,
|
|
.padding_h = 1, .padding_w = 1,
|
|
.precision = SYNOR_FP32
|
|
};
|
|
synor_result_t* conv = synor_conv2d(client, input, kernel, &conv_opts);
|
|
|
|
// Attention
|
|
synor_attention_options_t attn_opts = {
|
|
.num_heads = 8,
|
|
.flash = true,
|
|
.precision = SYNOR_FP16
|
|
};
|
|
synor_result_t* attn = synor_attention(client, query, key, value, &attn_opts);
|
|
```
|
|
|
|
## LLM Inference
|
|
|
|
```c
|
|
// Single response
|
|
synor_inference_options_t opts = {
|
|
.max_tokens = 512,
|
|
.temperature = 0.7f,
|
|
.top_p = 0.9f
|
|
};
|
|
synor_inference_result_t* response = synor_inference(
|
|
client, "llama-3-70b", "Explain quantum computing", &opts
|
|
);
|
|
if (response) {
|
|
printf("%s\n", response->result);
|
|
synor_inference_result_free(response);
|
|
}
|
|
|
|
// Streaming with callback
|
|
void on_chunk(const char* chunk, void* user_data) {
|
|
printf("%s", chunk);
|
|
fflush(stdout);
|
|
}
|
|
|
|
synor_inference_stream(client, "llama-3-70b", "Write a poem",
|
|
&opts, on_chunk, NULL);
|
|
```
|
|
|
|
## Configuration
|
|
|
|
```c
|
|
synor_config_t config = {
|
|
.api_key = "your-api-key",
|
|
.base_url = "https://api.synor.io/compute/v1",
|
|
.default_processor = SYNOR_PROCESSOR_GPU,
|
|
.default_precision = SYNOR_FP16,
|
|
.timeout_secs = 30,
|
|
.debug = false
|
|
};
|
|
|
|
synor_client_t* client = synor_client_create_with_config(&config);
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
```c
|
|
synor_result_t* result = synor_matmul(client, a, b, &opts);
|
|
|
|
if (!result) {
|
|
const char* error = synor_get_last_error();
|
|
fprintf(stderr, "Error: %s\n", error);
|
|
} else if (result->status == SYNOR_STATUS_FAILED) {
|
|
fprintf(stderr, "Job failed: %s\n", result->error_message);
|
|
}
|
|
|
|
// Check for specific errors
|
|
synor_error_t err = synor_get_error_code();
|
|
switch (err) {
|
|
case SYNOR_ERROR_NETWORK:
|
|
fprintf(stderr, "Network error\n");
|
|
break;
|
|
case SYNOR_ERROR_AUTH:
|
|
fprintf(stderr, "Authentication failed\n");
|
|
break;
|
|
case SYNOR_ERROR_INVALID_ARG:
|
|
fprintf(stderr, "Invalid argument\n");
|
|
break;
|
|
}
|
|
```
|
|
|
|
## Types
|
|
|
|
```c
|
|
// Processor types
|
|
typedef enum {
|
|
SYNOR_PROCESSOR_CPU,
|
|
SYNOR_PROCESSOR_GPU,
|
|
SYNOR_PROCESSOR_TPU,
|
|
SYNOR_PROCESSOR_NPU,
|
|
SYNOR_PROCESSOR_LPU,
|
|
SYNOR_PROCESSOR_FPGA,
|
|
SYNOR_PROCESSOR_AUTO
|
|
} synor_processor_t;
|
|
|
|
// Precision
|
|
typedef enum {
|
|
SYNOR_FP64,
|
|
SYNOR_FP32,
|
|
SYNOR_FP16,
|
|
SYNOR_BF16,
|
|
SYNOR_INT8,
|
|
SYNOR_INT4
|
|
} synor_precision_t;
|
|
|
|
// Job status
|
|
typedef enum {
|
|
SYNOR_STATUS_PENDING,
|
|
SYNOR_STATUS_RUNNING,
|
|
SYNOR_STATUS_COMPLETED,
|
|
SYNOR_STATUS_FAILED,
|
|
SYNOR_STATUS_CANCELLED
|
|
} synor_status_t;
|
|
```
|
|
|
|
## Memory Management
|
|
|
|
All Synor objects must be freed:
|
|
|
|
```c
|
|
synor_tensor_free(tensor);
|
|
synor_result_free(result);
|
|
synor_inference_result_free(response);
|
|
synor_client_free(client);
|
|
```
|
|
|
|
## Thread Safety
|
|
|
|
The client is thread-safe. Each thread can share the same client instance.
|
|
|
|
## Requirements
|
|
|
|
- C99 or later
|
|
- libcurl for HTTP
|
|
- OpenSSL for TLS
|
|
|
|
## Building
|
|
|
|
```bash
|
|
mkdir build && cd build
|
|
cmake .. -DCMAKE_BUILD_TYPE=Release
|
|
make
|
|
```
|
|
|
|
## Testing
|
|
|
|
```bash
|
|
cd build
|
|
ctest
|
|
```
|
|
|
|
## License
|
|
|
|
MIT
|