Skip to content
Snippets Groups Projects

Fuse bn

Merged Cyril Moineau requested to merge fuseBN into main
4 unresolved threads
1 file
+ 13
11
Compare changes
  • Side-by-side
  • Inline
    • conversion functions will be excessively expensive. As number of dimension is practically a constant for a given tensor, I propose to preallocate a vector of coordinates of the right size and pass it by reference to the coordinate computation function and not return it. The actual implementation makes reallocations and then a full vector copy. Even if the compiler is smart, is not that smart

@@ -580,13 +580,14 @@ class Tensor : public Data,
* @param flatIdx 1D index of the value considering a flatten tensor.
* @return std::vector<DimSize_t>
*/
std::vector<std::size_t> getCoord(std::size_t flatIdx){
std::vector<std::size_t> coordIdx = {};
std::vector<std::size_t> getCoord(std::size_t flatIdx) const {
std::vector<std::size_t> coordIdx = std::vector<std::size_t>(mDims.size());
std::size_t idx = flatIdx;
for (std::size_t d: mDims){
coordIdx.push_back(idx % d);
idx/=d;
for (std::size_t i = mDims.size() - 1; i > 0; --i){
coordIdx[i] = (idx % mDims[i]);
idx/=mDims[i];
}
coordIdx[0] = idx % mDims[0];
return coordIdx;
}
@@ -596,16 +597,17 @@ class Tensor : public Data,
* @param coordIdx Coordinate to an element in the tensor
* @return DimSize_t
*/
std::size_t getIdx(std::vector<std::size_t> coordIdx){
std::size_t getIdx(std::vector<std::size_t> coordIdx) const {
// std::size_t flatIdx = 0;
// std::size_t stride = 1;
std::size_t flatIdx = 0;
std::size_t stride = 1;
assert(coordIdx.size() == mDims.size() && "Coordinates does not match number of dimensions");
for(std::size_t i=0; i< mDims.size(); ++i){
std::size_t i = 0;
for(; i < mDims.size() - 1; ++i){
assert(coordIdx[i] < mDims[i] && "Coordinates dimensions does not fit the dimensions of the tensor");
flatIdx += (coordIdx[i] * stride);
stride *= mDims[i];
flatIdx = (flatIdx + coordIdx[i]) * mDims[i + 1];
}
return flatIdx;
return flatIdx + coordIdx[i];
}
private:
Loading