| 426 | namespace convolution { |
| 427 | |
| 428 | void run_conv( |
| 429 | const float* src, const float* filter, float* dst, void* workspace, size_t IH, |
| 430 | size_t IW, size_t IC, size_t FH, size_t FW, size_t OH, size_t OW, size_t OC, |
| 431 | size_t PH, size_t PW, size_t SH, size_t SW, bool xcorr) { |
| 432 | for (size_t oc = 0; oc < OC; ++oc) |
| 433 | for (size_t ic = 0; ic < IC; ++ic) { |
| 434 | // ut for untransposed |
| 435 | const float* fut = filter + oc * IC * FH * FW + ic * FH * FW; |
| 436 | const float* f; |
| 437 | if (!xcorr) { |
| 438 | // need transpose |
| 439 | f = (float*)workspace; |
| 440 | for (size_t fh = 0; fh < FH; ++fh) |
| 441 | for (size_t fw = 0; fw < FW; ++fw) { |
| 442 | ((float*)f)[fh * FW + fw] = |
| 443 | fut[(FH - fh - 1) * FW + (FW - fw - 1)]; |
| 444 | } |
| 445 | } else { |
| 446 | // do not need transpose |
| 447 | f = fut; |
| 448 | } |
| 449 | run_xcorr_single_channel( |
| 450 | src + ic * IH * IW, f, dst + oc * OH * OW, IH, IW, FH, FW, OH, OW, |
| 451 | PH, PW, SH, SW, ic > 0); |
| 452 | } |
| 453 | } |
| 454 | |
| 455 | void run_conv_backward_data( |
| 456 | const float* diff, const float* filter, float* grad, void* workspace, size_t IH, |
no test coverage detected