diff --git a/Project.toml b/Project.toml index 19d280c..22126bd 100644 --- a/Project.toml +++ b/Project.toml @@ -9,18 +9,21 @@ SIMD = "fdea26ae-647d-5447-a871-4b548cad5224" StridedViews = "4db3bf67-4bd7-4b4e-b153-31dc3fb37143" TensorOperations = "6aa20fa7-93e2-5fca-9bc0-fbd0db3c71a2" TupleTools = "9d95972d-f1c8-5527-a6e0-b4b365fa01f6" +VectorInterface = "409d34a3-91d5-4945-b6ec-7529ddf182d8" [compat] Aqua = "0.8" Bumper = "0.7" InteractiveUtils = "1" LinearAlgebra = "1" +ParallelTestRunner = "2.9" Random = "1" SIMD = "3" Strided = "2.6" StridedViews = "0.5" TensorOperations = "5.8" TupleTools = "1.6" +VectorInterface = "0.4.1, 0.5, 0.6, 0.7" Test = "1" julia = "1.10" @@ -28,9 +31,10 @@ julia = "1.10" Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" Bumper = "8ce10254-0962-460f-a3d8-1f77fea1446e" InteractiveUtils = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +ParallelTestRunner = "d3525ed8-44d0-4b2c-a655-542cee43accc" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Strided = "5e0ebb24-38b0-5f93-81fe-25c709ecae67" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test", "Random", "Strided", "Aqua", "Bumper", "InteractiveUtils"] +test = ["Test", "Random", "Strided", "Aqua", "Bumper", "InteractiveUtils", "ParallelTestRunner"] diff --git a/README.md b/README.md index 82c85a4..e2d4e49 100644 --- a/README.md +++ b/README.md @@ -64,8 +64,8 @@ plan = plan_contract(StridedView(C), StridedView(A), (1, 2, 3), execute!(plan, 1.0, 0.0) ``` -`plan_contract` also takes `workspace=`/`allocator=` keywords (e.g. for -Bumper-backed buffers); see its docstring. +`plan_contract` also takes an `allocator=` keyword (e.g. for Bumper-backed +buffers); see its docstring. ## API @@ -95,7 +95,7 @@ and `B` into panels and drives a microkernel over register tiles of `C`. | `src/packing/` | packed-panel formats and the `pack_a!`/`pack_b!` packers with contiguous fast paths | | `src/microkernels/` | the kernel interface and the scalar, SIMD, planar, 1m and fmaddsub kernels | | `src/planning/` | label classification, conjugation, kernel selection, cache blocking, `plan_contract` | -| `src/execution/` | the workspace, the five-loop nest, the specialised paths and the tile-by-tile oracle | +| `src/execution/` | the workspace, the barriers, the five-loop nest and the specialised paths | | `src/integrations/` | `QuasiStridedBackend` for TensorOperations.jl | `test/` mirrors this layout. @@ -127,8 +127,8 @@ Implemented: `eltype(C)` once. `conjA`/`conjB` and each operand's `StridedView.op` are applied during packing. - Zero steady-state allocation on Julia >= 1.11 for `execute!` on a reused - plan and for `tensorcontract!` through the backend (which pools workspaces - per task). On Julia 1.10 `SIMDKernel`'s accumulator is not kept in + plan; `tensorcontract!` through the backend plans each call, so it allocates + the plan's workspace through the given allocator. On Julia 1.10 `SIMDKernel`'s accumulator is not kept in registers, so calls allocate; results are unaffected. Not implemented: diff --git a/benchmark/README.md b/benchmark/README.md new file mode 100644 index 0000000..4081a02 --- /dev/null +++ b/benchmark/README.md @@ -0,0 +1,29 @@ +# Benchmarks + +Single-core scripts; each script's header has its options and outputs. All run +from the repo root with `julia --project=benchmark benchmark/