im com (slice)
This commit is contained in:
parent
058d7503d7
commit
dcb76cc450
5 changed files with 47 additions and 14 deletions
|
@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.8)
|
|||
|
||||
project(multi_array)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++11 -Wpedantic -O3 -g")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++11 -Wpedantic -O3 -g -march=native")
|
||||
|
||||
enable_testing()
|
||||
|
||||
|
|
|
@ -51,6 +51,14 @@ namespace MultiArrayTools
|
|||
// multi_array_operation.h
|
||||
template <typename T, class Op, class IndexType>
|
||||
class Contraction;
|
||||
|
||||
// slice.h
|
||||
template <typename T, class... SRanges>
|
||||
class Slice;
|
||||
|
||||
// slice.h
|
||||
template <typename T, class... SRanges>
|
||||
class SliceDef;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -51,7 +51,7 @@ namespace MultiArrayHelper
|
|||
}
|
||||
|
||||
template <class OpTuple, class Expr>
|
||||
static auto mkLoop( const OpTuple& ot, Expr&& exp )
|
||||
static auto mkLoop( const OpTuple& ot, Expr exp )
|
||||
-> decltype(std::get<N>(ot).loop( PackNum<N-1>::mkLoop(ot,exp) ))
|
||||
{
|
||||
return std::get<N>(ot).loop( PackNum<N-1>::mkLoop(ot,exp) );
|
||||
|
@ -92,7 +92,7 @@ namespace MultiArrayHelper
|
|||
}
|
||||
|
||||
template <class OpTuple, class Expr>
|
||||
static auto mkLoop( const OpTuple& ot, Expr&& exp )
|
||||
static auto mkLoop( const OpTuple& ot, Expr exp )
|
||||
-> decltype(std::get<0>(ot).loop( exp ))
|
||||
{
|
||||
return std::get<0>(ot).loop( exp );
|
||||
|
|
|
@ -35,11 +35,26 @@ namespace MultiArrayTools
|
|||
|
||||
template <class... MARanges>
|
||||
auto define(const std::shared_ptr<typename SRanges::IType>&... inds)
|
||||
-> SliceDef<T,OperationRoot<T,MARanges...> >;
|
||||
-> SliceDef<T,MARanges...>;
|
||||
|
||||
private:
|
||||
T* mData;
|
||||
};
|
||||
|
||||
|
||||
template <typename T, class... SRanges>
|
||||
class SliceDef
|
||||
{
|
||||
private:
|
||||
SliceDef() = default;
|
||||
|
||||
public:
|
||||
SliceDef(Slice<T,SRanges...>& sl,
|
||||
const std::shared_ptr<typename SRanges::IndexType>&... inds);
|
||||
|
||||
template <class... ORanges>
|
||||
SliceDef& operator=(OperationRoot<T,ORanges...>& op);
|
||||
};
|
||||
|
||||
} // end namespace MultiArrayTools
|
||||
|
||||
|
@ -122,8 +137,14 @@ namespace MultiArrayTools
|
|||
//i = std::get<sizeof...(SRanges)>(mBlockSizes);
|
||||
return i.setData(data());
|
||||
}
|
||||
|
||||
/*
|
||||
SliceDef<T,SRanges...>::
|
||||
SliceDef(Slice<T,SRanges...>& sl,
|
||||
const std::shared_ptr<typename SRanges::IndexType>&... inds);
|
||||
|
||||
template <class... ORanges>
|
||||
SliceDef<T,SRanges...>& SliceDef<T,SRanges...>::operator=(OperationRoot<T,ORanges...>& op);
|
||||
*/
|
||||
|
||||
} // end namespace MultiArrayTools
|
||||
|
||||
|
|
|
@ -174,24 +174,28 @@ namespace {
|
|||
<< std::endl;
|
||||
|
||||
std::vector<double> vres(4*4);
|
||||
|
||||
std::clock_t begin2 = std::clock();
|
||||
for(size_t i = 0; i != 1000; ++i){
|
||||
for(size_t d = 0; d != 4; ++d){
|
||||
for(size_t p = 0; p != 4; ++p){
|
||||
const size_t tidx = d*4 + p;
|
||||
vres[tidx] = 0.;
|
||||
for(size_t a = 0; a != 4; ++a){
|
||||
for(size_t b = 0; b != 4; ++b){
|
||||
for(size_t c = 0; c != 4; ++c){
|
||||
const size_t sidx = d*4*4*4*4*4*4*4 + a*5*4*4*4*4*4 + b*5*4*4*4 + + c*5*4 + p;
|
||||
vres[tidx] += data[sidx];
|
||||
}
|
||||
}
|
||||
std::clock_t begin2 = std::clock();
|
||||
for(size_t i = 0; i != 1000; ++i){
|
||||
for(size_t a = 0; a != 4; ++a){
|
||||
for(size_t b = 0; b != 4; ++b){
|
||||
for(size_t c = 0; c != 4; ++c){
|
||||
for(size_t d = 0; d != 4; ++d){
|
||||
for(size_t p = 0; p != 4; ++p){
|
||||
const size_t tidx = d*4 + p;
|
||||
const size_t sidx = d*4*4*4*4*4*4*4 + a*5*4*4*4*4*4 + b*5*4*4*4 + + c*5*4 + p;
|
||||
vres[tidx] += data[sidx];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
std::clock_t end2 = std::clock();
|
||||
|
||||
assert( xround(res1.at(mkts(0,0))) == xround(vres[0]) );
|
||||
|
|
Loading…
Reference in a new issue