Merge pull request #2091 from wangkuiyi/majel-place
Add Majel's Place concept to Paddlerefactor_docs
commit
49d70c4c66
@ -0,0 +1,10 @@
|
||||
CCFLAGS = -std=c++11 -I/work/paddle
|
||||
CC = nvcc
|
||||
|
||||
all : place_test
|
||||
|
||||
place.o : place.h place.cu
|
||||
$(CC) $(CCFLAGS) -c place.cu -o $@
|
||||
|
||||
place_test : place.o place_test.cu
|
||||
$(CC) $(CCFLAGS) -lgtest -lgtest_main $^ -o $@
|
@ -0,0 +1,61 @@
|
||||
#include <majel/place.h>
|
||||
|
||||
namespace majel {
|
||||
|
||||
namespace detail {
|
||||
|
||||
class PlacePrinter
|
||||
: public boost::static_visitor<> {
|
||||
private:
|
||||
std::ostream& os_;
|
||||
public:
|
||||
PlacePrinter(std::ostream& os) : os_(os) {}
|
||||
|
||||
void operator()(const CpuPlace&) {
|
||||
os_ << "CpuPlace";
|
||||
}
|
||||
|
||||
void operator()(const GpuPlace& p) {
|
||||
os_ << "GpuPlace(" << p.device << ")";
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace majel
|
||||
|
||||
static Place the_default_place;
|
||||
|
||||
void set_place(const Place& place) {
|
||||
the_default_place = place;
|
||||
}
|
||||
|
||||
const Place& get_place() {
|
||||
return the_default_place;
|
||||
}
|
||||
|
||||
const GpuPlace default_gpu() {
|
||||
return GpuPlace(0);
|
||||
}
|
||||
|
||||
const CpuPlace default_cpu() {
|
||||
return CpuPlace();
|
||||
}
|
||||
|
||||
bool is_gpu_place(const Place& p) {
|
||||
return boost::apply_visitor(IsGpuPlace(), p);
|
||||
}
|
||||
|
||||
bool is_cpu_place(const Place& p) {
|
||||
return !boost::apply_visitor(IsGpuPlace(), p);
|
||||
}
|
||||
|
||||
bool places_are_same_class(const Place& p1, const Place& p2) {
|
||||
return is_gpu_place(p1) == is_gpu_place(p2);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const majel::Place& p) {
|
||||
majel::detail::PlacePrinter printer(os);
|
||||
boost::apply_visitor(printer, p);
|
||||
return os;
|
||||
}
|
||||
|
||||
} // namespace majel
|
@ -0,0 +1,50 @@
|
||||
#pragma once
|
||||
#include <boost/variant.hpp>
|
||||
#include <iostream>
|
||||
|
||||
namespace majel {
|
||||
|
||||
struct CpuPlace {
|
||||
CpuPlace() {} // WORKAROUND: for some reason, omitting this constructor
|
||||
// causes errors with boost 1.59 and OSX
|
||||
// needed for variant equality comparison
|
||||
inline bool operator==(const CpuPlace&) const { return true; }
|
||||
|
||||
inline bool operator!=(const CpuPlace&) const { return false; }
|
||||
};
|
||||
|
||||
struct GpuPlace {
|
||||
GpuPlace(int d) : device(d) {}
|
||||
|
||||
// needed for variant equality comparison
|
||||
inline bool operator==(const GpuPlace& o) const { return device == o.device; }
|
||||
|
||||
inline bool operator!=(const GpuPlace& o) const { return !(*this == o); }
|
||||
|
||||
GpuPlace() : GpuPlace(0) {}
|
||||
int device;
|
||||
};
|
||||
|
||||
class IsGpuPlace : public boost::static_visitor<bool> {
|
||||
public:
|
||||
bool operator()(const CpuPlace&) const { return false; }
|
||||
|
||||
bool operator()(const GpuPlace& gpu) const { return true; }
|
||||
};
|
||||
|
||||
typedef boost::variant<GpuPlace, CpuPlace> Place;
|
||||
|
||||
void set_place(const Place&);
|
||||
|
||||
const Place& get_place();
|
||||
|
||||
const GpuPlace default_gpu();
|
||||
const CpuPlace default_cpu();
|
||||
|
||||
bool is_gpu_place(const Place&);
|
||||
bool is_cpu_place(const Place&);
|
||||
bool places_are_same_class(const Place&, const Place&);
|
||||
|
||||
std::ostream& operator<<(std::ostream&, const majel::Place&);
|
||||
|
||||
} // namespace majel
|
@ -0,0 +1,40 @@
|
||||
#include "gtest/gtest.h"
|
||||
#include "majel/place.h"
|
||||
#include <sstream>
|
||||
|
||||
TEST(Place, Equality) {
|
||||
majel::CpuPlace cpu;
|
||||
majel::GpuPlace g0(0), g1(1), gg0(0);
|
||||
|
||||
EXPECT_EQ(cpu, cpu);
|
||||
EXPECT_EQ(g0, g0);
|
||||
EXPECT_EQ(g1, g1);
|
||||
EXPECT_EQ(g0, gg0);
|
||||
|
||||
EXPECT_NE(g0, g1);
|
||||
|
||||
EXPECT_TRUE(majel::places_are_same_class(g0, gg0));
|
||||
EXPECT_FALSE(majel::places_are_same_class(g0, cpu));
|
||||
}
|
||||
|
||||
TEST(Place, Default) {
|
||||
EXPECT_TRUE(majel::is_gpu_place( majel::get_place()));
|
||||
EXPECT_TRUE(majel::is_gpu_place( majel::default_gpu()));
|
||||
EXPECT_TRUE(majel::is_cpu_place( majel::default_cpu()));
|
||||
|
||||
majel::set_place(majel::CpuPlace());
|
||||
EXPECT_TRUE(majel::is_cpu_place( majel::get_place()));
|
||||
}
|
||||
|
||||
TEST(Place, Print) {
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << majel::GpuPlace(1);
|
||||
EXPECT_EQ("GpuPlace(1)", ss.str());
|
||||
}
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << majel::CpuPlace();
|
||||
EXPECT_EQ("CpuPlace", ss.str());
|
||||
}
|
||||
}
|
Loading…
Reference in new issue