From 0b6ff52f6a157d4a5eb559d90c5c6bf2f9ee9894 Mon Sep 17 00:00:00 2001 From: Sam Anklesaria Date: Tue, 19 Aug 2025 16:12:07 +0000 Subject: [PATCH 1/6] Extract accessor definition into separate PR --- src/libtorchaudio/CMakeLists.txt | 1 + src/libtorchaudio/accessor.h | 46 +++++++++++++++++++++++ src/libtorchaudio/accessor_tests.cpp | 46 +++++++++++++++++++++++ test/torchaudio_unittest/accessor_test.py | 7 ++++ 4 files changed, 100 insertions(+) create mode 100644 src/libtorchaudio/accessor.h create mode 100644 src/libtorchaudio/accessor_tests.cpp create mode 100644 test/torchaudio_unittest/accessor_test.py diff --git a/src/libtorchaudio/CMakeLists.txt b/src/libtorchaudio/CMakeLists.txt index 85bc227cd6..20ad792b32 100644 --- a/src/libtorchaudio/CMakeLists.txt +++ b/src/libtorchaudio/CMakeLists.txt @@ -6,6 +6,7 @@ set( lfilter.cpp overdrive.cpp utils.cpp + accessor_tests.cpp ) set( diff --git a/src/libtorchaudio/accessor.h b/src/libtorchaudio/accessor.h new file mode 100644 index 0000000000..0fc23e978f --- /dev/null +++ b/src/libtorchaudio/accessor.h @@ -0,0 +1,46 @@ +#pragma once + +#include +#include +#include + +using torch::stable::Tensor; + +template +class Accessor { + int64_t strides[k]; + T *data; + +public: + using tensor_type = typename std::conditional::type; + + Accessor(tensor_type tensor) { + data = (T*)tensor.template data_ptr(); + for (unsigned int i = 0; i < k; i++) { + strides[i] = tensor.stride(i); + } + } + + T index(...) { + va_list args; + va_start(args, k); + int64_t ix = 0; + for (unsigned int i = 0; i < k; i++) { + ix += strides[i] * va_arg(args, int); + } + va_end(args); + return data[ix]; + } + + template + typename std::enable_if::type set_index(T value, ...) { + va_list args; + va_start(args, value); + int64_t ix = 0; + for (unsigned int i = 0; i < k; i++) { + ix += strides[i] * va_arg(args, int); + } + va_end(args); + data[ix] = value; + } +}; diff --git a/src/libtorchaudio/accessor_tests.cpp b/src/libtorchaudio/accessor_tests.cpp new file mode 100644 index 0000000000..62e9b23d5a --- /dev/null +++ b/src/libtorchaudio/accessor_tests.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include + +namespace torchaudio { + +namespace accessor_tests { + +using namespace std; +using torch::stable::Tensor; + +bool test_accessor(const Tensor tensor) { + int64_t* data_ptr = (int64_t*)tensor.data_ptr(); + auto accessor = Accessor<3, int64_t>(tensor); + for (unsigned int i = 0; i < tensor.size(0); i++) { + for (unsigned int j = 0; j < tensor.size(1); j++) { + for (unsigned int k = 0; k < tensor.size(2); k++) { + auto check = *(data_ptr++) == accessor.index(i, j, k); + if (!check) { + return false; + } + } + } + } + return true; +} + +void boxed_test_accessor(StableIValue* stack, uint64_t num_args, uint64_t num_outputs) { + Tensor t1(to(stack[0])); + auto result = test_accessor(std::move(t1)); + stack[0] = from(result); +} + +TORCH_LIBRARY_FRAGMENT(torchaudio, m) { + m.def( + "_test_accessor(Tensor log_probs) -> bool"); +} + +STABLE_TORCH_LIBRARY_IMPL(torchaudio, CPU, m) { + m.impl("torchaudio::_test_accessor", &boxed_test_accessor); +} + +} +} diff --git a/test/torchaudio_unittest/accessor_test.py b/test/torchaudio_unittest/accessor_test.py new file mode 100644 index 0000000000..db14258dc6 --- /dev/null +++ b/test/torchaudio_unittest/accessor_test.py @@ -0,0 +1,7 @@ +import torch +from torchaudio._extension import _IS_TORCHAUDIO_EXT_AVAILABLE + +if _IS_TORCHAUDIO_EXT_AVAILABLE: + def test_accessor(): + tensor = torch.randint(1000, (5,4,3)) + assert torch.ops.torchaudio._test_accessor(tensor) From 9355217cdbd88618848c19ed19980829646dcbb6 Mon Sep 17 00:00:00 2001 From: Sam Anklesaria Date: Tue, 19 Aug 2025 21:32:55 +0000 Subject: [PATCH 2/6] Avoid use of 'template' syntax --- src/libtorchaudio/accessor.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libtorchaudio/accessor.h b/src/libtorchaudio/accessor.h index 0fc23e978f..412188ecb1 100644 --- a/src/libtorchaudio/accessor.h +++ b/src/libtorchaudio/accessor.h @@ -15,7 +15,8 @@ class Accessor { using tensor_type = typename std::conditional::type; Accessor(tensor_type tensor) { - data = (T*)tensor.template data_ptr(); + auto raw_ptr = tensor.data_ptr(); + data = static_cast(raw_ptr); for (unsigned int i = 0; i < k; i++) { strides[i] = tensor.stride(i); } From 67b3ddb39278f036db37838b2e9eb7c13d9fa9f8 Mon Sep 17 00:00:00 2001 From: Sam Anklesaria Date: Tue, 19 Aug 2025 22:08:41 +0000 Subject: [PATCH 3/6] Add size method to accessor --- src/libtorchaudio/accessor.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libtorchaudio/accessor.h b/src/libtorchaudio/accessor.h index 412188ecb1..27642ef727 100644 --- a/src/libtorchaudio/accessor.h +++ b/src/libtorchaudio/accessor.h @@ -9,6 +9,7 @@ using torch::stable::Tensor; template class Accessor { int64_t strides[k]; + int64_t sizes[k]; T *data; public: @@ -19,6 +20,7 @@ class Accessor { data = static_cast(raw_ptr); for (unsigned int i = 0; i < k; i++) { strides[i] = tensor.stride(i); + sizes[i] = tensor.size(i); } } @@ -33,6 +35,10 @@ class Accessor { return data[ix]; } + int64_t size(int dim) { + return sizes[dim]; + } + template typename std::enable_if::type set_index(T value, ...) { va_list args; From 6dc108a0a916f92426655f0b232d0a8e57daa08c Mon Sep 17 00:00:00 2001 From: Sam Anklesaria Date: Wed, 20 Aug 2025 21:29:08 +0000 Subject: [PATCH 4/6] Use 'STABLE' prefix for test library declaration --- src/libtorchaudio/accessor_tests.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libtorchaudio/accessor_tests.cpp b/src/libtorchaudio/accessor_tests.cpp index 62e9b23d5a..45312a8408 100644 --- a/src/libtorchaudio/accessor_tests.cpp +++ b/src/libtorchaudio/accessor_tests.cpp @@ -1,7 +1,5 @@ #include #include -#include -#include #include namespace torchaudio { @@ -33,7 +31,7 @@ void boxed_test_accessor(StableIValue* stack, uint64_t num_args, uint64_t num_ou stack[0] = from(result); } -TORCH_LIBRARY_FRAGMENT(torchaudio, m) { +STABLE_TORCH_LIBRARY_FRAGMENT(torchaudio, m) { m.def( "_test_accessor(Tensor log_probs) -> bool"); } From ed0e83020d28af3e9c385d98c0808376607bb235 Mon Sep 17 00:00:00 2001 From: Sam Anklesaria Date: Thu, 21 Aug 2025 14:45:10 +0000 Subject: [PATCH 5/6] Undo addition of stable headers in forced_align --- src/libtorchaudio/forced_align/cpu/compute.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/libtorchaudio/forced_align/cpu/compute.cpp b/src/libtorchaudio/forced_align/cpu/compute.cpp index 0ddd21b126..4b87b20e5f 100644 --- a/src/libtorchaudio/forced_align/cpu/compute.cpp +++ b/src/libtorchaudio/forced_align/cpu/compute.cpp @@ -1,8 +1,5 @@ #include #include -#include -#include -#include #include using namespace std; From 44504eaa7d49fba426b959b46832a39632237b0e Mon Sep 17 00:00:00 2001 From: Sam Anklesaria Date: Thu, 21 Aug 2025 15:58:26 +0000 Subject: [PATCH 6/6] Import tensor_struct rather than tensor --- src/libtorchaudio/accessor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libtorchaudio/accessor.h b/src/libtorchaudio/accessor.h index 27642ef727..6211acff3d 100644 --- a/src/libtorchaudio/accessor.h +++ b/src/libtorchaudio/accessor.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include