Skip to content

vDSP functions in ggml-cpu/binary-ops.cpp need type casting on at least one older version of OS X #3072

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
exprez135 opened this issue Apr 24, 2025 · 1 comment

Comments

@exprez135
Copy link

While testing my work on updating whisper.cpp packaging on MacPorts, @barracuda156 discovered an issue with older OS X versions (output copied below), in which apparently vDSP functions like vDSP_vadd were not using const float as they are now, which leads to an error.

using vDSP_fn_t = void (*)(const float *, vDSP_Stride, const float *, vDSP_Stride, float *, vDSP_Stride, vDSP_Length); AKA {aka 'void (*)(const float*, long int, const float*, long int, float*, long int, long unsigned int)'}

But it appears that on his OS X 10.6, vDSP_v{div,add,sub,mul} were void (*)(float*, long int, float*, long int, float*, long int, long unsigned int)?

I think that a potential fix would be to put each of these (starting https://github.com/ggml-org/whisper.cpp/blob/adaea088bca383ac7abebdce26546f1885bd9376/ggml/src/ggml-cpu/binary-ops.cpp#L73C1-L73C33) inside a reinterpret_cast<>()?

vDSP_op = reinterpret_cast<vDSP_fn_t>(vDSP_vadd); etc.

His error output:

/_opt_local_ppcports_audio_whisper/whisper/work/whisper.cpp-1.7.5/ggml/src/ggml-cpu -I/opt/local/var/macports/build/_opt_local_ppcports_audio_whisper/whisper/work/whisper.cpp-1.7.5/ggml/src/../include -F//System/Library/Frameworks -pipe -Os -DNDEBUG -isystem/opt/local/include/LegacySupport -I/opt/local/include -D_GLIBCXX_USE_CXX11_ABI=0 -std=gnu++17 -arch ppc -mmacosx-version-min=10.6 -fPIC -Wmissing-declarations -Wmissing-noreturn -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function -Wno-array-bounds -Wextra-semi -fopenmp -MD -MT ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/unary-ops.cpp.o -MF CMakeFiles/ggml-cpu.dir/ggml-cpu/unary-ops.cpp.o.d -o CMakeFiles/ggml-cpu.dir/ggml-cpu/unary-ops.cpp.o -c /opt/local/var/macports/build/_opt_local_ppcports_audio_whisper/whisper/work/whisper.cpp-1.7.5/ggml/src/ggml-cpu/unary-ops.cpp
/opt/local/var/macports/build/_opt_local_ppcports_audio_whisper/whisper/work/whisper.cpp-1.7.5/ggml/src/ggml-cpu/binary-ops.cpp: In instantiation of 'void apply_binary_op(const ggml_compute_params*, ggml_tensor*) [with float (* op)(float, float) = op_add; src0_t = float; src1_t = float; dst_t = float]':
/opt/local/var/macports/build/_opt_local_ppcports_audio_whisper/whisper/work/whisper.cpp-1.7.5/ggml/src/ggml-cpu/binary-ops.cpp:125:49:   required from 'void binary_op(const ggml_compute_params*, ggml_tensor*) [with float (* op)(float, float) = op_add]'
  125 |         apply_binary_op<op, float, float, float>(params, dst);
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
/opt/local/var/macports/build/_opt_local_ppcports_audio_whisper/whisper/work/whisper.cpp-1.7.5/ggml/src/ggml-cpu/binary-ops.cpp:145:22:   required from here
  145 |     binary_op<op_add>(params, dst);
      |     ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
/opt/local/var/macports/build/_opt_local_ppcports_audio_whisper/whisper/work/whisper.cpp-1.7.5/ggml/src/ggml-cpu/binary-ops.cpp:79:23: error: invalid conversion from 'void (*)(float*, vDSP_Stride, float*, vDSP_Stride, float*, vDSP_Stride, vDSP_Length)' {aka 'void (*)(float*, long int, float*, long int, float*, long int, long unsigned int)'} to 'vDSP_fn_t' {aka 'void (*)(const float*, long int, const float*, long int, float*, long int, long unsigned int)'} [-fpermissive]
   79 |             vDSP_op = vDSP_vdiv;
      |                       ^~~~~~~~~
      |                       |
      |                       void (*)(float*, vDSP_Stride, float*, vDSP_Stride, float*, vDSP_Stride, vDSP_Length) {aka void (*)(float*, long int, float*, long int, float*, long int, long unsigned int)}
/opt/local/var/macports/build/_opt_local_ppcports_audio_whisper/whisper/work/whisper.cpp-1.7.5/ggml/src/ggml-cpu/binary-ops.cpp: In instantiation of 'void apply_binary_op(const ggml_compute_params*, ggml_tensor*) [with float (* op)(float, float) = op_add; src0_t = short unsigned int; src1_t = short unsigned int; dst_t = short unsigned int]':
/opt/local/var/macports/build/_opt_local_ppcports_audio_whisper/whisper/work/whisper.cpp-1.7.5/ggml/src/ggml-cpu/binary-ops.cpp:127:67:   required from 'void binary_op(const ggml_compute_params*, ggml_tensor*) [with float (* op)(float, float) = op_add]'
  127 |         apply_binary_op<op, ggml_fp16_t, ggml_fp16_t, ggml_fp16_t>(params, dst);
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
/opt/local/var/macports/build/_opt_local_ppcports_audio_whisper/whisper/work/whisper.cpp-1.7.5/ggml/src/ggml-cpu/binary-ops.cpp:145:22:   required from here
  145 |     binary_op<op_add>(params, dst);
      |     ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
/opt/local/var/macports/build/_opt_local_ppcports_audio_whisper/whisper/work/whisper.cpp-1.7.5/ggml/src/ggml-cpu/binary-ops.cpp:79:23: error: invalid conversion from 'void (*)(float*, vDSP_Stride, float*, vDSP_Stride, float*, vDSP_Stride, vDSP_Length)' {aka 'void (*)(float*, long int, float*, long int, float*, long int, long unsigned int)'} to 'vDSP_fn_t' {aka 'void (*)(const float*, long int, const float*, long int, float*, long int, long unsigned int)'} [-fpermissive]
   79 |             vDSP_op = vDSP_vdiv;
      |                       ^~~~~~~~~
      |                       |
@barracuda156
Copy link

Just in case, I can test suggested patches.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants