Initial commit
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
.zig-cache/
|
||||
zig-out/
|
||||
zig-pkg/
|
||||
*.o
|
||||
*.a
|
||||
*.so
|
||||
*.dylib
|
||||
*.dll
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 kbz_8
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,65 @@
|
||||
# miclib Zig wrapper
|
||||
|
||||
Zig 0.16 wrapper for Intel/CIRCL `miclib.h` / `libmicmgmt`.
|
||||
|
||||
This repo does **not** vendor MPSS, `miclib.h`, `scif.h`, `libmicmgmt`, or `libscif`.
|
||||
Install/build miclib separately, then point Zig at the include/library directories.
|
||||
|
||||
## Build
|
||||
|
||||
```sh
|
||||
zig build \
|
||||
-Dmiclib_include=/usr/local/include \
|
||||
-Dmiclib_libdir=/usr/local/lib
|
||||
```
|
||||
|
||||
The default miclib system library name is `micmgmt`, which links `-lmicmgmt`.
|
||||
Override it if your install uses another name:
|
||||
|
||||
```sh
|
||||
zig build -Dmiclib_name=micmgmt
|
||||
```
|
||||
|
||||
`miclib.h` includes `scif.h`, so `-Dmiclib_include` must reference a directory where both headers are visible.
|
||||
The build script links `micmgmt`, `scif`, libc, and libc++ because the upstream implementation is C++ with a C ABI.
|
||||
|
||||
## Use as a dependency
|
||||
|
||||
```sh
|
||||
zig fetch --save git+https://git.kbz8.me/kbz_8/miclib-zig.git
|
||||
```
|
||||
|
||||
Then in your `build.zig`:
|
||||
|
||||
```zig
|
||||
const miclib_dep = b.dependency("miclib", .{
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
.miclib_include = "/usr/local/include",
|
||||
.miclib_libdir = "/usr/local/lib",
|
||||
});
|
||||
|
||||
exe.root_module.addImport("miclib", miclib_dep.module("miclib"));
|
||||
```
|
||||
|
||||
Then in Zig:
|
||||
|
||||
```zig
|
||||
const mic = @import("miclib");
|
||||
|
||||
var list = try mic.DeviceList.init();
|
||||
defer list.deinit();
|
||||
|
||||
const count = try list.count();
|
||||
for (0..count) |index| {
|
||||
const device_num = try list.deviceAtIndex(index);
|
||||
var device = try mic.Device.open(device_num);
|
||||
defer device.deinit();
|
||||
|
||||
var memory = try device.memoryInfo();
|
||||
defer memory.deinit();
|
||||
|
||||
const mem_mib = try memory.size();
|
||||
_ = mem_mib;
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,84 @@
|
||||
const std = @import("std");
|
||||
|
||||
pub fn build(b: *std.Build) void {
|
||||
const target = b.standardTargetOptions(.{});
|
||||
const optimize = b.standardOptimizeOption(.{});
|
||||
|
||||
const miclib_include = b.option(
|
||||
[]const u8,
|
||||
"miclib_include",
|
||||
"Directory containing miclib.h and scif.h. Example: -Dmiclib_include=/usr/local/include",
|
||||
);
|
||||
|
||||
const miclib_libdir = b.option(
|
||||
[]const u8,
|
||||
"miclib_libdir",
|
||||
"Directory containing libmicmgmt.so/libscif.so. Example: -Dmiclib_libdir=/usr/local/lib",
|
||||
);
|
||||
|
||||
const miclib_name = b.option(
|
||||
[]const u8,
|
||||
"miclib_name",
|
||||
"System library name for miclib without lib/extension. Default: micmgmt",
|
||||
) orelse "micmgmt";
|
||||
|
||||
const module = b.addModule("miclib", .{
|
||||
.root_source_file = b.path("src/lib.zig"),
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
.link_libc = true,
|
||||
});
|
||||
configureMiclibModule(module, miclib_include, miclib_libdir, miclib_name);
|
||||
|
||||
const test_module = b.createModule(.{
|
||||
.root_source_file = b.path("src/lib.zig"),
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
.link_libc = true,
|
||||
});
|
||||
configureMiclibModule(test_module, miclib_include, miclib_libdir, miclib_name);
|
||||
|
||||
const c_includes = b.addTranslateC(.{
|
||||
.root_source_file = b.path("src/c_includes.h"),
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
.link_libc = true,
|
||||
});
|
||||
|
||||
module.addImport("miclib_c", c_includes.createModule());
|
||||
|
||||
const lib_tests = b.addTest(.{ .root_module = test_module });
|
||||
const run_tests = b.addRunArtifact(lib_tests);
|
||||
const test_step = b.step("test", "Run unit tests");
|
||||
test_step.dependOn(&run_tests.step);
|
||||
|
||||
const enumerate_module = b.createModule(.{
|
||||
.root_source_file = b.path("examples/enumerate.zig"),
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
.imports = &.{.{ .name = "miclib", .module = module }},
|
||||
});
|
||||
|
||||
const enumerate = b.addExecutable(.{
|
||||
.name = "miclib-enumerate",
|
||||
.root_module = enumerate_module,
|
||||
});
|
||||
|
||||
b.installArtifact(enumerate);
|
||||
|
||||
const run_enumerate = b.addRunArtifact(enumerate);
|
||||
const run_step = b.step("example", "Run examples/enumerate.zig");
|
||||
run_step.dependOn(&run_enumerate.step);
|
||||
}
|
||||
|
||||
fn configureMiclibModule(module: *std.Build.Module, miclib_include: ?[]const u8, miclib_libdir: ?[]const u8, miclib_name: []const u8) void {
|
||||
if (miclib_include) |path|
|
||||
module.addIncludePath(.{ .cwd_relative = path });
|
||||
|
||||
if (miclib_libdir) |path|
|
||||
module.addLibraryPath(.{ .cwd_relative = path });
|
||||
|
||||
module.link_libcpp = true;
|
||||
module.linkSystemLibrary(miclib_name, .{});
|
||||
module.linkSystemLibrary("scif", .{});
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
.{
|
||||
.name = .miclib,
|
||||
.version = "1.0.0",
|
||||
.fingerprint = 0xee5712284bf0b001,
|
||||
.minimum_zig_version = "0.16.0",
|
||||
.dependencies = .{},
|
||||
.paths = .{
|
||||
"build.zig",
|
||||
"build.zig.zon",
|
||||
"src",
|
||||
"examples",
|
||||
"README.md",
|
||||
"LICENSE",
|
||||
"third_party",
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
const std = @import("std");
|
||||
const mic = @import("miclib");
|
||||
|
||||
pub fn main() !void {
|
||||
var devices = mic.DeviceList.init() catch |err| {
|
||||
std.debug.print("mic_get_devices failed: {s}\n", .{@errorName(err)});
|
||||
printLastMicError();
|
||||
return err;
|
||||
};
|
||||
defer devices.deinit();
|
||||
|
||||
const count = try devices.count();
|
||||
std.debug.print("found {} MIC device(s)\n", .{count});
|
||||
|
||||
for (0..count) |index| {
|
||||
const device_num = try devices.deviceAtIndex(index);
|
||||
var device = mic.Device.open(device_num) catch |err| {
|
||||
std.debug.print("mic{}: open failed: {s}\n", .{ device_num, @errorName(err) });
|
||||
printLastMicError();
|
||||
continue;
|
||||
};
|
||||
defer device.deinit();
|
||||
|
||||
try printDevice(device_num, device);
|
||||
}
|
||||
}
|
||||
|
||||
fn printDevice(device_num: u32, device: mic.Device) !void {
|
||||
var buffer: [mic.default_string_buffer_len]u8 = undefined;
|
||||
|
||||
const device_type = device.deviceType() catch 0;
|
||||
std.debug.print("\nmic{}: {s}\n", .{ device_num, device.name() });
|
||||
std.debug.print(" type: {}{s}\n", .{ device_type, if (device_type == mic.knc_id) " (KNC)" else "" });
|
||||
|
||||
if (device.serialNumber(buffer[0..])) |serial| {
|
||||
std.debug.print(" serial: {s}\n", .{serial});
|
||||
} else |err| printSkipped("serial", err);
|
||||
|
||||
if (device.siliconSku(buffer[0..])) |sku| {
|
||||
std.debug.print(" sku: {s}\n", .{sku});
|
||||
} else |err| printSkipped("sku", err);
|
||||
|
||||
if (device.pciConfig()) |pci_value| {
|
||||
var pci = pci_value;
|
||||
defer pci.deinit();
|
||||
|
||||
std.debug.print(" pci: {x:0>4}:{x:0>2}:{x:0>2}, vendor={x:0>4}, device={x:0>4}\n", .{
|
||||
pci.domainId() catch 0,
|
||||
pci.busNumber() catch 0,
|
||||
pci.deviceNumber() catch 0,
|
||||
pci.vendorId() catch 0,
|
||||
pci.deviceId() catch 0,
|
||||
});
|
||||
|
||||
if (pci.linkSpeed(buffer[0..])) |speed| {
|
||||
std.debug.print(" pci-link: {s} x{}\n", .{ speed, pci.linkWidth() catch 0 });
|
||||
} else |err| printSkipped("pci-link", err);
|
||||
} else |err| printSkipped("pci", err);
|
||||
|
||||
if (device.coresInfo()) |cores_value| {
|
||||
var cores = cores_value;
|
||||
defer cores.deinit();
|
||||
|
||||
std.debug.print(" cores: {}, freq={} MHz, voltage={} mV\n", .{
|
||||
cores.count() catch 0,
|
||||
cores.frequency() catch 0,
|
||||
cores.voltage() catch 0,
|
||||
});
|
||||
} else |err| printSkipped("cores", err);
|
||||
|
||||
if (device.memoryInfo()) |memory_value| {
|
||||
var memory = memory_value;
|
||||
defer memory.deinit();
|
||||
|
||||
const memory_type = memory.memoryType(buffer[0..]) catch "unknown";
|
||||
std.debug.print(" memory: {} MiB, type={s}, freq={} MHz, ecc={}\n", .{
|
||||
memory.size() catch 0,
|
||||
memory_type,
|
||||
memory.frequency() catch 0,
|
||||
memory.eccMode() catch 0,
|
||||
});
|
||||
} else |err| printSkipped("memory", err);
|
||||
|
||||
if (device.thermalInfo()) |thermal_value| {
|
||||
var thermal = thermal_value;
|
||||
defer thermal.deinit();
|
||||
|
||||
std.debug.print(" thermals: die={} C, fan={} RPM, pwm={}\n", .{
|
||||
thermal.dieTemp() catch 0,
|
||||
thermal.fanRpm() catch 0,
|
||||
thermal.fanPwm() catch 0,
|
||||
});
|
||||
} else |err| printSkipped("thermals", err);
|
||||
|
||||
if (device.versionInfo()) |version_value| {
|
||||
var version = version_value;
|
||||
defer version.deinit();
|
||||
|
||||
if (version.uosVersion(buffer[0..])) |uos| {
|
||||
std.debug.print(" uos: {s}\n", .{uos});
|
||||
} else |err| printSkipped("uos", err);
|
||||
|
||||
if (version.flashVersion(buffer[0..])) |flash| {
|
||||
std.debug.print(" flash: {s}\n", .{flash});
|
||||
} else |err| printSkipped("flash", err);
|
||||
} else |err| printSkipped("version", err);
|
||||
}
|
||||
|
||||
fn printSkipped(name: []const u8, err: anyerror) void {
|
||||
std.debug.print(" {s}: unavailable ({s})\n", .{ name, @errorName(err) });
|
||||
}
|
||||
|
||||
fn printLastMicError() void {
|
||||
const last = mic.lastErrorString();
|
||||
if (last.len != 0) std.debug.print("miclib: {s}\n", .{last});
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
#include <miclib.h>
|
||||
+1045
File diff suppressed because it is too large
Load Diff
Vendored
+7
@@ -0,0 +1,7 @@
|
||||
# Third-party notices
|
||||
|
||||
This package is a Zig wrapper only. It does not vendor or redistribute Intel/CIRCL `miclib.h`, `scif.h`, `libmicmgmt`, `libscif`, MPSS, or any Xeon Phi firmware/tooling.
|
||||
|
||||
The upstream `CIRCL/miclib` repository describes itself as `miclib v3.6.1 (Intel Xeon Phi Coprocessor) for Ubuntu LTS 14.04 Trusty (extracted from mpss-micmgmt)`.
|
||||
|
||||
The upstream `miclib.h` header is licensed under LGPL-2.1 text in its header comments and carries Intel notices. Link and distribute the native library according to the license terms that apply to your installed MPSS/miclib build.
|
||||
Reference in New Issue
Block a user