gen_base.cc 2.8 KB
Newer Older
T
tensor-tang 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License. */

T
tensor-tang 已提交
15
#include "paddle/fluid/operators/jit/gen_base.h"
T
tensor-tang 已提交
16 17 18
#include <fstream>
#include <iostream>
#include <sstream>
19
#include <vector>
20
#include "paddle/fluid/memory/allocation/cpu_allocator.h"  // for posix_memalign
21
#include "paddle/fluid/platform/cpu_info.h"
22 23 24 25 26
#include "paddle/fluid/platform/enforce.h"

#ifndef _WIN32
#define posix_memalign_free free
#endif
T
tensor-tang 已提交
27 28 29 30 31

DEFINE_bool(dump_jitcode, false, "Whether to dump the jitcode to file");

namespace paddle {
namespace operators {
T
tensor-tang 已提交
32
namespace jit {
T
tensor-tang 已提交
33 34

// refer do not need useme, it would be the last one.
T
tensor-tang 已提交
35
void GenBase::dumpCode(const unsigned char* code) const {
T
tensor-tang 已提交
36 37 38 39 40 41 42
  if (code) {
    static int counter = 0;
    std::ostringstream filename;
    filename << "paddle_jitcode_" << name() << "." << counter << ".bin";
    counter++;
    std::ofstream fout(filename.str(), std::ios::out);
    if (fout.is_open()) {
T
tensor-tang 已提交
43
      fout.write(reinterpret_cast<const char*>(code), this->getSize());
T
tensor-tang 已提交
44 45 46 47 48
      fout.close();
    }
  }
}

49 50 51 52 53 54 55 56 57 58 59
void* GenBase::operator new(size_t size) {
  void* ptr;
  constexpr size_t alignment = 32ul;
  PADDLE_ENFORCE_EQ(posix_memalign(&ptr, alignment, size), 0,
                    "GenBase Alloc %ld error!", size);
  PADDLE_ENFORCE(ptr, "Fail to allocate GenBase CPU memory: size = %d .", size);
  return ptr;
}

void GenBase::operator delete(void* ptr) { posix_memalign_free(ptr); }

60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
std::vector<int> packed_groups(int n, int k, int* block_out, int* rest_out) {
  int block;
  int max_num_regs;
  if (platform::MayIUse(platform::avx512f)) {
    block = ZMM_FLOAT_BLOCK;
    max_num_regs = 32;
  } else {
    block = YMM_FLOAT_BLOCK;
    max_num_regs = 16;
  }
  // one for x, one for y, others for z
  const int max_used_regs_for_n = max_num_regs - 2;
  const int aligned_n = n % block == 0 ? n : (n / block + 1) * block;
  const int num_block = aligned_n / block;
  const int num_groups = num_block / max_used_regs_for_n;
  std::vector<int> groups(num_groups, max_used_regs_for_n);
  int rest_num_regs = num_block % max_used_regs_for_n;
  if (rest_num_regs != 0) {
    groups.push_back(rest_num_regs);
  }
  if (block_out) {
    *block_out = block;
  }
  if (rest_out) {
    *rest_out = n % block;
  }
  return groups;
}

T
tensor-tang 已提交
89
}  // namespace jit
T
tensor-tang 已提交
90 91
}  // namespace operators
}  // namespace paddle