@@ -369,8 +369,9 @@ void ConvLayerOneDnn::initialize_special_conv(const Shape& input_shape,
369369 if (has_bias) {
370370 bias_md = dnnl::memory::desc (
371371 {static_cast <dnnl::memory::dim>(bias_.get_shape ()[0 ])}, dt,
372- dnnl::memory::format_tag::any );
372+ dnnl::memory::format_tag::a );
373373 }
374+
374375 dnnl::convolution_forward::primitive_desc conv_pd =
375376 has_bias ? dnnl::convolution_forward::primitive_desc (
376377 *engine_, dnnl::prop_kind::forward_inference,
@@ -391,20 +392,21 @@ void ConvLayerOneDnn::initialize_special_conv(const Shape& input_shape,
391392
392393 if (data_type == Type::kFloat ) {
393394 const std::vector<float >& kernel_data = *kernel_.as <float >();
395+
394396 size_t kh = k_shape[0 ];
395397 size_t kw = k_shape[1 ];
396398 size_t kic = k_shape[2 ];
397399 size_t koc = k_shape[3 ];
398400
399401 std::vector<float > reordered (koc * kic * kh * kw);
400- size_t idx = 0 ;
401402
402- for (size_t oc = 0 ; oc < koc; oc++ ) {
403- for (size_t ic = 0 ; ic < kic; ic++ ) {
404- for (size_t h = 0 ; h < kh; h++ ) {
405- for (size_t w = 0 ; w < kw; w++ ) {
403+ for (size_t oc = 0 ; oc < koc; ++oc ) {
404+ for (size_t ic = 0 ; ic < kic; ++ic ) {
405+ for (size_t h = 0 ; h < kh; ++h ) {
406+ for (size_t w = 0 ; w < kw; ++w ) {
406407 size_t src_idx = ((h * kw + w) * kic + ic) * koc + oc;
407- reordered[idx++] = kernel_data[src_idx];
408+ size_t dst_idx = ((oc * kic + ic) * kh + h) * kw + w;
409+ reordered[dst_idx] = kernel_data[src_idx];
408410 }
409411 }
410412 }
@@ -421,14 +423,13 @@ void ConvLayerOneDnn::initialize_special_conv(const Shape& input_shape,
421423 size_t koc = k_shape[3 ];
422424
423425 std::vector<float > reordered (koc * kic * kh * kw);
424- size_t idx = 0 ;
425-
426- for (size_t oc = 0 ; oc < koc; oc++) {
427- for (size_t ic = 0 ; ic < kic; ic++) {
428- for (size_t h = 0 ; h < kh; h++) {
429- for (size_t w = 0 ; w < kw; w++) {
426+ for (size_t oc = 0 ; oc < koc; ++oc) {
427+ for (size_t ic = 0 ; ic < kic; ++ic) {
428+ for (size_t h = 0 ; h < kh; ++h) {
429+ for (size_t w = 0 ; w < kw; ++w) {
430430 size_t src_idx = ((h * kw + w) * kic + ic) * koc + oc;
431- reordered[idx++] = static_cast <float >(kernel_data_int[src_idx]);
431+ size_t dst_idx = ((oc * kic + ic) * kh + h) * kw + w;
432+ reordered[dst_idx] = static_cast <float >(kernel_data_int[src_idx]);
432433 }
433434 }
434435 }
@@ -438,6 +439,22 @@ void ConvLayerOneDnn::initialize_special_conv(const Shape& input_shape,
438439 reordered.size () * sizeof (float ));
439440 }
440441
442+ if (has_bias) {
443+ if (data_type == Type::kFloat ) {
444+ const std::vector<float >& bias_data = *bias_.as <float >();
445+ std::memcpy (bias_memory_.get_data_handle (), bias_data.data (),
446+ bias_data.size () * sizeof (float ));
447+ } else if (data_type == Type::kInt ) {
448+ const std::vector<int >& bias_data_int = *bias_.as <int >();
449+ std::vector<float > float_bias (bias_data_int.size ());
450+ std::transform (bias_data_int.begin (), bias_data_int.end (),
451+ float_bias.begin (),
452+ [](int val) { return static_cast <float >(val); });
453+ std::memcpy (bias_memory_.get_data_handle (), float_bias.data (),
454+ float_bias.size () * sizeof (float ));
455+ }
456+ }
457+
441458 conv_prim_ = std::make_unique<dnnl::convolution_forward>(conv_pd);
442459 initialized_ = true ;
443460
@@ -494,8 +511,8 @@ void ConvLayerOneDnn::run_special_conv(const std::vector<Tensor>& input,
494511 Shape output_shape = get_output_shape (input_shape);
495512
496513 if (data_type == Type::kFloat ) {
497- std::vector< float > output_data ( dst_memory_.get_desc ().get_size () /
498- sizeof ( float ) );
514+ size_t output_size = dst_memory_.get_desc ().get_size () / sizeof ( float );
515+ std::vector< float > output_data (output_size );
499516 std::memcpy (output_data.data (), dst_memory_.get_data_handle (),
500517 output_data.size () * sizeof (float ));
501518 output[0 ] = make_tensor (output_data, output_shape);
0 commit comments