Skip to content

Commit

Permalink
Merge branch 'AAAlvesJr-master'
Browse files Browse the repository at this point in the history
  • Loading branch information
Augusto authored and Augusto committed Apr 10, 2016
2 parents 42095b4 + f8446ec commit c4a7c16
Show file tree
Hide file tree
Showing 9 changed files with 540 additions and 112 deletions.
20 changes: 20 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,26 @@ MESSAGE(STATUS "Install diretory: " ${CMAKE_INSTALL_PREFIX} )
if(BUILD_CUDA_TARGETS)

#make cuda targets

cuda_add_executable(MCBooster_Example_CUDA_CompareWithRoot
${CMAKE_CURRENT_SOURCE_DIR}/src/CompareWithTGenPhaseSpace.cu
)

target_link_libraries(MCBooster_Example_CUDA_CompareWithRoot
${ROOT_LIBRARIES}
rt
)

cuda_add_executable(MCBooster_Example_OpenMP_CompareWithRoot
${CMAKE_CURRENT_SOURCE_DIR}/src/CompareWithTGenPhaseSpace.cu
OPTIONS -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_OMP
)

target_link_libraries(MCBooster_Example_OpenMP_CompareWithRoot
${ROOT_LIBRARIES}
rt
)


cuda_add_executable(MCBooster_Example_CUDA_GenerateSample
${CMAKE_CURRENT_SOURCE_DIR}/src/GenerateSample.cu
Expand Down
123 changes: 65 additions & 58 deletions mcbooster/Generate.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@
#include <thrust/extrema.h>
#include <thrust/count.h>
#include <thrust/fill.h>
#include <thrust/sort.h>
#include <thrust/iterator/counting_iterator.h>

#if !(THRUST_DEVICE_SYSTEM==THRUST_DEVICE_BACKEND_OMP || THRUST_DEVICE_SYSTEM==THRUST_DEVICE_BACKEND_TBB)
#include <thrust/system/cuda/execution_policy.h>
Expand Down Expand Up @@ -171,7 +173,8 @@ class PhaseSpace {
*/
PhaseSpace(GReal_t _MotherMass, vector<GReal_t> _Masses, GLong_t _NEvents) :
fNDaughters(_Masses.size()), fNEvents(_NEvents),
fRandNumbers((3 * _Masses.size() - 2) * _NEvents, 0.0), fMaxWeight(0.0),
fSeed(1),
fMaxWeight(0.0),
RND_Time(0.0), EVT_Time(0.0), EXP_Time(0.0), fNAccepted(0)
{

Expand Down Expand Up @@ -224,8 +227,8 @@ class PhaseSpace {

fWeights.clear();
fWeights.shrink_to_fit();
fRandNumbers.clear();
fRandNumbers.shrink_to_fit();
//fRandNumbers.clear();
//fRandNumbers.shrink_to_fit();
fAccRejFlags.clear();
fAccRejFlags.shrink_to_fit();
}
Expand Down Expand Up @@ -294,6 +297,14 @@ class PhaseSpace {
return fMaxWeight;
}

inline GInt_t GetSeed() const {
return fSeed;
}

inline void SetSeed(GInt_t _seed) {
fSeed=_seed;
}

/**
* Export the events and all related information to host.
*/
Expand Down Expand Up @@ -334,6 +345,7 @@ class PhaseSpace {

GLong_t fNEvents; ///< Number of events.
GInt_t fNDaughters;///< Number of daughters.
GInt_t fSeed;///< seed.
GLong_t fNAccepted;
GReal_t RND_Time;///< Random number generation time interval seconds.
GReal_t EVT_Time;///< Event generation time interval in seconds.
Expand All @@ -344,7 +356,6 @@ class PhaseSpace {
RealVector_d fWeights;///< Device vector of weights.
BoolVector_d fAccRejFlags;///< Device vector of Accept/reject flags
Particles_d fDaughters[kMAXP];///< Array of device vectors with the daughter four-vectors
RealVector_d fRandNumbers;///<


};
Expand All @@ -363,10 +374,13 @@ GULong_t PhaseSpace::Unweight()
}
else
{
mc_device_vector<GLong_t> Evt(fNEvents);
thrust::sequence(Evt.begin(), Evt.end());

thrust::transform(Evt.begin(), Evt.end(), fWeights.begin(),
// create iterators
thrust::counting_iterator<GLong_t> first(0);
thrust::counting_iterator<GLong_t> last = first + fNEvents;


thrust::transform(first, last, fWeights.begin(),
fAccRejFlags.begin(), FlagAcceptReject(fMaxWeight));

count = thrust::count(fAccRejFlags.begin(), fAccRejFlags.end(),
Expand Down Expand Up @@ -534,20 +548,11 @@ void PhaseSpace::Generate(const Vector4R fMother) {
cudaDeviceSetCacheConfig(cudaFuncCachePreferL1);
#endif
/* random number generation */
timespec time_rnd_start, time_rnd_end;
clock_gettime(TIMER, &time_rnd_start);

mc_device_vector<GLong_t> Evt(fNEvents);
thrust::sequence(Evt.begin(), Evt.end());

thrust::for_each(Evt.begin(), Evt.end(),
RandGen(fNDaughters,
(thrust::raw_pointer_cast(fRandNumbers.data()))));

clock_gettime(TIMER, &time_rnd_end);

RND_Time = ((GReal_t) (time_diff(time_rnd_start, time_rnd_end).tv_sec
+ time_diff(time_rnd_start, time_rnd_end).tv_nsec * 1.0e-9));
RND_Time = 0;
// create iterators
thrust::counting_iterator<GLong_t> first(0);
thrust::counting_iterator<GLong_t> last = first + fNEvents;

//Vai!!!

Expand All @@ -559,92 +564,92 @@ void PhaseSpace::Generate(const Vector4R fMother) {

case 2:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fDaughters[0].begin(),
fDaughters[1].begin())), fWeights.begin(),
DecayMother(fMother, fMasses, fNDaughters, fRandNumbers));
DecayMother(fMother, fMasses, fNDaughters, fSeed));

break;

case 3:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fDaughters[0].begin(),
fDaughters[1].begin(), fDaughters[2].begin())),
fWeights.begin(),
DecayMother(fMother, fMasses, fNDaughters, fRandNumbers));
DecayMother(fMother, fMasses, fNDaughters, fSeed));

break;
case 4:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fDaughters[0].begin(),
fDaughters[1].begin(), fDaughters[2].begin(),
fDaughters[3].begin())), fWeights.begin(),
DecayMother(fMother, fMasses, fNDaughters, fRandNumbers));
DecayMother(fMother, fMasses, fNDaughters, fSeed));

break;
case 5:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fDaughters[0].begin(),
fDaughters[1].begin(), fDaughters[2].begin(),
fDaughters[3].begin(), fDaughters[4].begin())),
fWeights.begin(),
DecayMother(fMother, fMasses, fNDaughters, fRandNumbers));
DecayMother(fMother, fMasses, fNDaughters, fSeed));

//}
break;
case 6:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fDaughters[0].begin(),
fDaughters[1].begin(), fDaughters[2].begin(),
fDaughters[3].begin(), fDaughters[4].begin(),
fDaughters[5].begin())), fWeights.begin(),
DecayMother(fMother, fMasses, fNDaughters, fRandNumbers));
DecayMother(fMother, fMasses, fNDaughters, fSeed));

break;
case 7:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fDaughters[0].begin(),
fDaughters[1].begin(), fDaughters[2].begin(),
fDaughters[3].begin(), fDaughters[4].begin(),
fDaughters[5].begin(), fDaughters[6].begin())),
fWeights.begin(),
DecayMother(fMother, fMasses, fNDaughters, fRandNumbers));
DecayMother(fMother, fMasses, fNDaughters, fSeed));

break;
case 8:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fDaughters[0].begin(),
fDaughters[1].begin(), fDaughters[2].begin(),
fDaughters[3].begin(), fDaughters[4].begin(),
fDaughters[5].begin(), fDaughters[6].begin(),
fDaughters[7].begin())), fWeights.begin(),
DecayMother(fMother, fMasses, fNDaughters, fRandNumbers));
DecayMother(fMother, fMasses, fNDaughters, fSeed));

break;
case 9:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fDaughters[0].begin(),
fDaughters[1].begin(), fDaughters[2].begin(),
fDaughters[3].begin(), fDaughters[4].begin(),
fDaughters[5].begin(), fDaughters[6].begin(),
fDaughters[7].begin(), fDaughters[8].begin())),
fWeights.begin(),
DecayMother(fMother, fMasses, fNDaughters, fRandNumbers));
DecayMother(fMother, fMasses, fNDaughters, fSeed));

break;

Expand Down Expand Up @@ -674,118 +679,120 @@ void PhaseSpace::Generate(Particles_d fMothers) {
cout << "fNEvents != fMothers.size()" << endl;

/* random number generation */
/*
timespec time_rnd_start, time_rnd_end;
clock_gettime(TIMER, &time_rnd_start);
mc_device_vector<GLong_t> Evt(fNEvents);
thrust::sequence(Evt.begin(), Evt.end());

thrust::for_each(Evt.begin(), Evt.end(),
RandGen(fNDaughters,
(thrust::raw_pointer_cast(fRandNumbers.data()))));
clock_gettime(TIMER, &time_rnd_end);
RND_Time = ((GReal_t) (time_diff(time_rnd_start, time_rnd_end).tv_sec
+ time_diff(time_rnd_start, time_rnd_end).tv_nsec * 1.0e-9));
*/

/* event generation */
timespec time_event_start, time_event_end;
clock_gettime(TIMER, &time_event_start);

RND_Time = 0.0;
// create iterators
thrust::counting_iterator<GLong_t> first(0);
thrust::counting_iterator<GLong_t> last = first + fNEvents;


switch (fNDaughters) {

case 2:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fMothers.begin(),
fDaughters[0].begin(), fDaughters[1].begin())),
fWeights.begin(),
DecayMothers(fMasses, fNDaughters, fRandNumbers));
DecayMothers(fMasses, fNDaughters, fSeed));

break;

case 3:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fMothers.begin(),
fDaughters[0].begin(), fDaughters[1].begin(),
fDaughters[2].begin())), fWeights.begin(),
DecayMothers(fMasses, fNDaughters, fRandNumbers));
DecayMothers(fMasses, fNDaughters, fSeed));

break;
case 4:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fMothers.begin(),
fDaughters[0].begin(), fDaughters[1].begin(),
fDaughters[2].begin(), fDaughters[3].begin())),
fWeights.begin(),
DecayMothers(fMasses, fNDaughters, fRandNumbers));
DecayMothers(fMasses, fNDaughters, fSeed));

break;
case 5:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fMothers.begin(),
fDaughters[0].begin(), fDaughters[1].begin(),
fDaughters[2].begin(), fDaughters[3].begin(),
fDaughters[4].begin())), fWeights.begin(),
DecayMothers(fMasses, fNDaughters, fRandNumbers));
DecayMothers(fMasses, fNDaughters, fSeed));

break;
case 6:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fMothers.begin(),
fDaughters[0].begin(), fDaughters[1].begin(),
fDaughters[2].begin(), fDaughters[3].begin(),
fDaughters[4].begin(), fDaughters[5].begin())),
fWeights.begin(),
DecayMothers(fMasses, fNDaughters, fRandNumbers));
DecayMothers(fMasses, fNDaughters, fSeed));

break;
case 7:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fMothers.begin(),
fDaughters[0].begin(), fDaughters[1].begin(),
fDaughters[2].begin(), fDaughters[3].begin(),
fDaughters[4].begin(), fDaughters[5].begin(),
fDaughters[6].begin())), fWeights.begin(),
DecayMothers(fMasses, fNDaughters, fRandNumbers));
DecayMothers(fMasses, fNDaughters, fSeed));

break;
case 8:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fMothers.begin(),
fDaughters[0].begin(), fDaughters[1].begin(),
fDaughters[2].begin(), fDaughters[3].begin(),
fDaughters[4].begin(), fDaughters[5].begin(),
fDaughters[6].begin(), fDaughters[7].begin())),
fWeights.begin(),
DecayMothers(fMasses, fNDaughters, fRandNumbers));
DecayMothers(fMasses, fNDaughters, fSeed));

break;
case 9:

thrust::transform(Evt.begin(), Evt.end(),
thrust::transform(first, last,
thrust::make_zip_iterator(
thrust::make_tuple(fMothers.begin(),
fDaughters[0].begin(), fDaughters[1].begin(),
fDaughters[2].begin(), fDaughters[3].begin(),
fDaughters[4].begin(), fDaughters[5].begin(),
fDaughters[6].begin(), fDaughters[7].begin(),
fDaughters[8].begin())), fWeights.begin(),
DecayMothers(fMasses, fNDaughters, fRandNumbers));
DecayMothers(fMasses, fNDaughters, fSeed));

break;

Expand Down
4 changes: 2 additions & 2 deletions mcbooster/MCBooster.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// the configured options
#define MCBooster_VERSION_MAJOR 1
#define MCBooster_VERSION_MINOR 0
#define MCBooster_VERSION_PATCH 1
#define MCBooster_VERSION_MINOR 1
#define MCBooster_VERSION_PATCH 0
/**
\mainpage Documentation
Expand Down
Loading

0 comments on commit c4a7c16

Please sign in to comment.