← Back to C-Kernel-Engine Docs Doxygen Source Documentation
 
Loading...
Searching...
No Matches
audio_conv1d_parallel.c
Go to the documentation of this file.
2#include "ck_threadpool.h"
4
5#include <limits.h>
6
7#if (defined(__x86_64__) || defined(__i386__)) && \
8 (defined(__GNUC__) || defined(__clang__))
9typedef struct {
10 const ck_audio_conv1d_job *job;
11 ck_threadpool_t *pool;
12 int workers;
13} ck_audio_conv1d_parallel_context;
14
15static void audio_conv1d_channel_range(int begin, int end, void *opaque)
16{
17 const ck_audio_conv1d_job *source = opaque;
18 ck_audio_conv1d_job range = *source;
19 range.channel_begin = (size_t)begin;
20 range.channel_end = (size_t)end;
21 audio_conv1d_compute_avx2(&range, NULL);
22}
23
24static void audio_conv1d_compute_parallel(const ck_audio_conv1d_job *job,
25 void *opaque)
26{
27 const ck_audio_conv1d_parallel_context *context = opaque;
28 const int channels = (int)job->output_channels;
29 int workers = context->workers;
30 if (workers > ck_threadpool_capacity(context->pool))
31 workers = ck_threadpool_capacity(context->pool);
32 if (workers > channels) workers = channels;
33 /* Dispatch overhead dominates tiny independent work. Both paths use the
34 * identical per-channel AVX2 implementation and ordered reduction. */
35 if (workers < 2 || channels < 8 || job->output_frames < 16) {
37 return;
38 }
39 const int grain = (channels + workers - 1) / workers;
40 ck_threadpool_parallel_for_n(context->pool, workers, 0, channels, grain,
41 audio_conv1d_channel_range, (void *)job);
42}
43#endif
44
46 const float *input, size_t input_elements, size_t input_stride,
47 const float *weight, size_t weight_elements,
48 const float *bias, size_t bias_elements,
49 float *output, size_t output_elements, size_t output_stride,
50 float *scratch, size_t scratch_elements,
51 size_t input_channels, size_t output_channels, size_t input_frames,
52 size_t kernel_size, size_t stride, size_t padding, size_t dilation,
53 size_t output_frames, void *worker_pool, size_t worker_count)
54{
55#if (defined(__x86_64__) || defined(__i386__)) && \
56 (defined(__GNUC__) || defined(__clang__))
59 if (!worker_pool || worker_count == 0 || worker_count > INT_MAX)
61 ck_audio_conv1d_parallel_context context = {
62 .pool = (ck_threadpool_t *)worker_pool,
63 .workers = (int)worker_count,
64 };
65 return ck_audio_conv1d_checked_execute(input, input_elements, input_stride,
66 weight, weight_elements, bias, bias_elements, output, output_elements,
67 output_stride, scratch, scratch_elements, input_channels,
68 output_channels, input_frames, kernel_size, stride, padding, dilation,
69 output_frames, audio_conv1d_compute_parallel, &context);
70#else
71 (void)input; (void)input_elements; (void)input_stride;
72 (void)weight; (void)weight_elements; (void)bias; (void)bias_elements;
73 (void)output; (void)output_elements; (void)output_stride;
74 (void)scratch; (void)scratch_elements; (void)input_channels;
75 (void)output_channels; (void)input_frames; (void)kernel_size;
76 (void)stride; (void)padding; (void)dilation; (void)output_frames;
77 (void)worker_pool; (void)worker_count;
79#endif
80}
81
83 const float *input, size_t input_elements, size_t input_stride,
84 const float *weight, size_t weight_elements,
85 const float *bias, size_t bias_elements,
86 float *output, size_t output_elements, size_t output_stride,
87 float *scratch, size_t scratch_elements,
88 size_t input_channels, size_t output_channels, size_t input_frames,
89 size_t kernel_size, size_t stride, size_t padding, size_t output_frames,
90 void *worker_pool, size_t worker_count)
91{
92 return audio_conv1d_parallel_checked_impl(input, input_elements,
93 input_stride, weight, weight_elements, bias, bias_elements, output,
94 output_elements, output_stride, scratch, scratch_elements,
95 input_channels, output_channels, input_frames, kernel_size, stride,
96 padding, 1, output_frames, worker_pool, worker_count);
97}
98
100 const float *input, size_t input_elements, size_t input_stride,
101 const float *weight, size_t weight_elements,
102 const float *bias, size_t bias_elements,
103 float *output, size_t output_elements, size_t output_stride,
104 float *scratch, size_t scratch_elements,
105 size_t input_channels, size_t output_channels, size_t input_frames,
106 size_t kernel_size, size_t stride, size_t padding, size_t dilation,
107 size_t output_frames, void *worker_pool, size_t worker_count)
108{
109 return audio_conv1d_parallel_checked_impl(input, input_elements,
110 input_stride, weight, weight_elements, bias, bias_elements, output,
111 output_elements, output_stride, scratch, scratch_elements,
112 input_channels, output_channels, input_frames, kernel_size, stride,
113 padding, dilation, output_frames, worker_pool, worker_count);
114}
int ck_audio_conv1d_checked_execute(const float *input, size_t input_elements, size_t input_stride, const float *weight, size_t weight_elements, const float *bias, size_t bias_elements, float *output, size_t output_elements, size_t output_stride, float *scratch, size_t scratch_elements, size_t input_channels, size_t output_channels, size_t input_frames, size_t kernel_size, size_t stride, size_t padding, size_t dilation, size_t output_frames, ck_audio_conv1d_compute_fn compute, void *compute_context)
void audio_conv1d_compute_avx2(const ck_audio_conv1d_job *job, void *unused)
static int audio_conv1d_parallel_checked_impl(const float *input, size_t input_elements, size_t input_stride, const float *weight, size_t weight_elements, const float *bias, size_t bias_elements, float *output, size_t output_elements, size_t output_stride, float *scratch, size_t scratch_elements, size_t input_channels, size_t output_channels, size_t input_frames, size_t kernel_size, size_t stride, size_t padding, size_t dilation, size_t output_frames, void *worker_pool, size_t worker_count)
int audio_conv1d_checked_channel_major_f32_avx2_parallel(const float *input, size_t input_elements, size_t input_stride, const float *weight, size_t weight_elements, const float *bias, size_t bias_elements, float *output, size_t output_elements, size_t output_stride, float *scratch, size_t scratch_elements, size_t input_channels, size_t output_channels, size_t input_frames, size_t kernel_size, size_t stride, size_t padding, size_t output_frames, void *worker_pool, size_t worker_count)
int audio_conv1d_dilated_checked_channel_major_f32_avx2_parallel(const float *input, size_t input_elements, size_t input_stride, const float *weight, size_t weight_elements, const float *bias, size_t bias_elements, float *output, size_t output_elements, size_t output_stride, float *scratch, size_t scratch_elements, size_t input_channels, size_t output_channels, size_t input_frames, size_t kernel_size, size_t stride, size_t padding, size_t dilation, size_t output_frames, void *worker_pool, size_t worker_count)
Persistent pthread thread pool for CK-Engine inference.
int ck_threadpool_capacity(const ck_threadpool_t *pool)
void ck_threadpool_parallel_for_n(ck_threadpool_t *pool, int active_threads, int begin, int end, int grain_size, ck_range_fn_t fn, void *args)
int audio_conv1d_checked_avx2_fma_available(void)
@ CK_AUDIO_CONV_CHECKED_UNSUPPORTED
@ CK_AUDIO_CONV_CHECKED_INVALID
uint32_t end
Definition utf8.c:215