mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-10 07:55:35 +00:00
Memory manager debug Felix case
This commit is contained in:
parent
4a359fa9e9
commit
f8c70545a0
@ -27,10 +27,13 @@ Author: paboyle <paboyle@ph.ed.ac.uk>
|
|||||||
/* END LEGAL */
|
/* END LEGAL */
|
||||||
|
|
||||||
#include <Grid/GridCore.h>
|
#include <Grid/GridCore.h>
|
||||||
#include <Grid/perfmon/PerfCount.h>
|
|
||||||
|
|
||||||
|
#include <Grid/perfmon/Timer.h>
|
||||||
|
#include <Grid/perfmon/PerfCount.h>
|
||||||
NAMESPACE_BEGIN(Grid);
|
NAMESPACE_BEGIN(Grid);
|
||||||
|
|
||||||
|
GridTimePoint theProgramStart = GridClock::now();
|
||||||
|
|
||||||
#define CacheControl(L,O,R) ((PERF_COUNT_HW_CACHE_##L)|(PERF_COUNT_HW_CACHE_OP_##O<<8)| (PERF_COUNT_HW_CACHE_RESULT_##R<<16))
|
#define CacheControl(L,O,R) ((PERF_COUNT_HW_CACHE_##L)|(PERF_COUNT_HW_CACHE_OP_##O<<8)| (PERF_COUNT_HW_CACHE_RESULT_##R<<16))
|
||||||
#define RawConfig(A,B) (A<<8|B)
|
#define RawConfig(A,B) (A<<8|B)
|
||||||
const PerformanceCounter::PerformanceCounterConfig PerformanceCounter::PerformanceCounterConfigs [] = {
|
const PerformanceCounter::PerformanceCounterConfig PerformanceCounter::PerformanceCounterConfigs [] = {
|
||||||
|
@ -35,17 +35,8 @@ Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
|||||||
|
|
||||||
NAMESPACE_BEGIN(Grid)
|
NAMESPACE_BEGIN(Grid)
|
||||||
|
|
||||||
// Dress the output; use std::chrono
|
//typedef std::chrono::system_clock GridClock;
|
||||||
// C++11 time facilities better?
|
typedef std::chrono::high_resolution_clock GridClock;
|
||||||
inline double usecond(void) {
|
|
||||||
struct timeval tv;
|
|
||||||
#ifdef TIMERS_ON
|
|
||||||
gettimeofday(&tv,NULL);
|
|
||||||
#endif
|
|
||||||
return 1.0*tv.tv_usec + 1.0e6*tv.tv_sec;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef std::chrono::system_clock GridClock;
|
|
||||||
typedef std::chrono::time_point<GridClock> GridTimePoint;
|
typedef std::chrono::time_point<GridClock> GridTimePoint;
|
||||||
|
|
||||||
typedef std::chrono::seconds GridSecs;
|
typedef std::chrono::seconds GridSecs;
|
||||||
@ -53,6 +44,15 @@ typedef std::chrono::milliseconds GridMillisecs;
|
|||||||
typedef std::chrono::microseconds GridUsecs;
|
typedef std::chrono::microseconds GridUsecs;
|
||||||
typedef std::chrono::microseconds GridTime;
|
typedef std::chrono::microseconds GridTime;
|
||||||
|
|
||||||
|
extern GridTimePoint theProgramStart;
|
||||||
|
// Dress the output; use std::chrono
|
||||||
|
// C++11 time facilities better?
|
||||||
|
inline double usecond(void) {
|
||||||
|
auto usecs = std::chrono::duration_cast<GridUsecs>(GridClock::now()-theProgramStart);
|
||||||
|
return 1.0*usecs.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline std::ostream& operator<< (std::ostream & stream, const GridSecs & time)
|
inline std::ostream& operator<< (std::ostream & stream, const GridSecs & time)
|
||||||
{
|
{
|
||||||
stream << time.count()<<" s";
|
stream << time.count()<<" s";
|
||||||
|
70
Grid/perfmon/Tracing.h
Normal file
70
Grid/perfmon/Tracing.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
NAMESPACE_BEGIN(Grid);
|
||||||
|
|
||||||
|
#ifdef GRID_TRACING_NVTX
|
||||||
|
#include <nvToolsExt.h>
|
||||||
|
class GridTracer {
|
||||||
|
public:
|
||||||
|
GridTracer(const char* name) {
|
||||||
|
nvtxRangePushA(name);
|
||||||
|
}
|
||||||
|
~GridTracer() {
|
||||||
|
nvtxRangePop();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
inline void tracePush(const char *name) { nvtxRangePushA(name); }
|
||||||
|
inline void tracePop(const char *name) { nvtxRangePop(); }
|
||||||
|
inline int traceStart(const char *name) { }
|
||||||
|
inline void traceStop(int ID) { }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GRID_TRACING_ROCTX
|
||||||
|
#include <roctracer/roctx.h>
|
||||||
|
class GridTracer {
|
||||||
|
public:
|
||||||
|
GridTracer(const char* name) {
|
||||||
|
roctxRangePushA(name);
|
||||||
|
std::cout << "roctxRangePush "<<name<<std::endl;
|
||||||
|
}
|
||||||
|
~GridTracer() {
|
||||||
|
roctxRangePop();
|
||||||
|
std::cout << "roctxRangePop "<<std::endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
inline void tracePush(const char *name) { roctxRangePushA(name); }
|
||||||
|
inline void tracePop(const char *name) { roctxRangePop(); }
|
||||||
|
inline int traceStart(const char *name) { roctxRangeStart(name); }
|
||||||
|
inline void traceStop(int ID) { roctxRangeStop(ID); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GRID_TRACING_TIMER
|
||||||
|
class GridTracer {
|
||||||
|
public:
|
||||||
|
const char *name;
|
||||||
|
double elapsed;
|
||||||
|
GridTracer(const char* _name) {
|
||||||
|
name = _name;
|
||||||
|
elapsed=-usecond();
|
||||||
|
}
|
||||||
|
~GridTracer() {
|
||||||
|
elapsed+=usecond();
|
||||||
|
std::cout << GridLogTracing << name << " took " <<elapsed<< " us" <<std::endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
inline void tracePush(const char *name) { }
|
||||||
|
inline void tracePop(const char *name) { }
|
||||||
|
inline int traceStart(const char *name) { return 0; }
|
||||||
|
inline void traceStop(int ID) { }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GRID_TRACING_NONE
|
||||||
|
#define GRID_TRACE(name)
|
||||||
|
inline void tracePush(const char *name) { }
|
||||||
|
inline void tracePop(const char *name) { }
|
||||||
|
inline int traceStart(const char *name) { return 0; }
|
||||||
|
inline void traceStop(int ID) { }
|
||||||
|
#else
|
||||||
|
#define GRID_TRACE(name) GridTracer uniq_name_using_macros##__COUNTER__(name);
|
||||||
|
#endif
|
||||||
|
NAMESPACE_END(Grid);
|
@ -1 +1 @@
|
|||||||
CXX=mpicxx-openmpi-mp CXXFLAGS=-I/opt/local/include/ LDFLAGS=-L/opt/local/lib/ ../../configure --enable-simd=GEN --enable-debug --enable-comms=mpi
|
CXX=mpicxx-openmpi-mp CXXFLAGS=-I/opt/local/include/ LDFLAGS=-L/opt/local/lib/ ../../configure --enable-simd=GEN --enable-debug --enable-comms=mpi --enable-unified=no
|
||||||
|
110
tests/core/Test_memory_manager.cc
Normal file
110
tests/core/Test_memory_manager.cc
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
|
Source file: ./tests/Test_memory_manager.cc
|
||||||
|
|
||||||
|
Copyright (C) 2022
|
||||||
|
|
||||||
|
Author: Peter Boyle <pboyle@bnl.gov>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
See the full license in the file "LICENSE" in the top level distribution directory
|
||||||
|
*************************************************************************************/
|
||||||
|
/* END LEGAL */
|
||||||
|
#include <Grid/Grid.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace Grid;
|
||||||
|
|
||||||
|
void MemoryTest(GridCartesian * FGrid,int N);
|
||||||
|
|
||||||
|
int main (int argc, char ** argv)
|
||||||
|
{
|
||||||
|
Grid_init(&argc,&argv);
|
||||||
|
|
||||||
|
GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
|
||||||
|
|
||||||
|
int N=100;
|
||||||
|
for(int i=0;i<N;i++){
|
||||||
|
std::cout << "============================"<<std::endl;
|
||||||
|
std::cout << "Epoch "<<i<<"/"<<N<<std::endl;
|
||||||
|
std::cout << "============================"<<std::endl;
|
||||||
|
MemoryTest(UGrid,256);
|
||||||
|
MemoryManager::Print();
|
||||||
|
AUDIT();
|
||||||
|
}
|
||||||
|
Grid_finalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MemoryTest(GridCartesian * FGrid, int N)
|
||||||
|
{
|
||||||
|
LatticeComplexD zero(FGrid); zero=Zero();
|
||||||
|
std::vector<LatticeComplexD> A(N,zero);//FGrid);
|
||||||
|
|
||||||
|
std::vector<ComplexD> B(N,ComplexD(0.0)); // Update sequentially on host
|
||||||
|
|
||||||
|
for(int v=0;v<N;v++) A[v] = Zero();
|
||||||
|
|
||||||
|
uint64_t counter = 0;
|
||||||
|
for(int epoch = 0;epoch<10000;epoch++){
|
||||||
|
|
||||||
|
int v = random() %N; // Which vec
|
||||||
|
int w = random() %2; // Write or read
|
||||||
|
int e = random() %3; // expression or for loop
|
||||||
|
int dev= random() %2; // On device?
|
||||||
|
// int e=1;
|
||||||
|
ComplexD zc = counter++;
|
||||||
|
|
||||||
|
if ( w ) {
|
||||||
|
B[v] = B[v] + zc;
|
||||||
|
if ( e == 0 ) {
|
||||||
|
A[v] = A[v] + zc - A[v] + A[v];
|
||||||
|
} else {
|
||||||
|
if ( dev ) {
|
||||||
|
autoView(A_v,A[v],AcceleratorWrite);
|
||||||
|
accelerator_for(ss,FGrid->oSites(),1,{
|
||||||
|
A_v[ss] = A_v[ss] + zc;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
autoView(A_v,A[v],CpuWrite);
|
||||||
|
thread_for(ss,FGrid->oSites(),{
|
||||||
|
A_v[ss] = A_v[ss] + zc;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ( e == 0 ) {
|
||||||
|
A[v] = A[v] + A[v] - A[v];
|
||||||
|
} else {
|
||||||
|
if ( dev ) {
|
||||||
|
autoView(A_v,A[v],AcceleratorRead);
|
||||||
|
accelerator_for(ss,FGrid->oSites(),1,{
|
||||||
|
assert(B[v]==A_v[ss]()()().getlane(0));
|
||||||
|
});
|
||||||
|
// std::cout << "["<<v<<"] checked on GPU"<<B[v]<<std::endl;
|
||||||
|
} else {
|
||||||
|
autoView(A_v,A[v],CpuRead);
|
||||||
|
thread_for(ss,FGrid->oSites(),{
|
||||||
|
assert(B[v]==A_v[ss]()()().getlane(0));
|
||||||
|
});
|
||||||
|
// std::cout << "["<<v<<"] checked on CPU"<<B[v]<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user