{"action":"created","comment":{"url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/comments/74609708","id":74609708,"diff_hunk":"@@ -0,0 +1,629 @@\n+#ifndef FFTW_HPP_\n+#define FFTW_HPP_\n+\n+#include \"types.hpp\"\n+#include \"application.hpp\"\n+#include \"timer.hpp\"\n+#include \"fft.hpp\"\n+#include \"benchmark_suite.hpp\"\n+//#include \"fftw_helper.hpp\"\n+\n+#include <array>\n+#include <thread>\n+#include <sstream>\n+#include <fftw3.h>\n+\n+namespace gearshifft {\n+  namespace fftw {\n+    \n+    namespace traits{\n+\n+      template <typename T>\n+      struct memory_api {};\n+\n+      template <>\n+      struct memory_api<float> {\n+\n+\tstatic void* malloc(size_t nbytes) { return fftwf_malloc(nbytes); }\n+\n+\tstatic void free(void* p) { fftwf_free(p); }\n+      };\n+\n+      template <>\n+      struct memory_api<double> {\n+\n+\tstatic void* malloc(size_t nbytes) { return fftw_malloc(nbytes); }\n+\n+\tstatic void free(void* p) { fftw_free(p); }\n+      };\n+\n+\n+      //http://www.fftw.org/fftw3_doc/Usage-of-Multi_002dthreaded-FFTW.html\n+      template <typename T>\n+      struct thread_api {};\n+\n+      template <>\n+      struct thread_api<double> {\n+\n+\t\n+\tstatic int init_threads() {\n+\t  int res = fftw_init_threads();\n+\t  return res;\n+\t}\n+\n+\tstatic void plan_with_threads(int nthreads = -1){\n+\n+\t  int av_procs = std::thread::hardware_concurrency();\n+\t  \n+\t  if(nthreads<1 || nthreads>av_procs)\n+\t    nthreads = av_procs;\n+\n+\t  fftw_plan_with_nthreads(nthreads);\n+\t    \n+\t}\n+\n+\tstatic void cleanup_threads(){\n+\t  fftw_cleanup_threads();\n+\t}\n+\t\n+      };\n+\n+      template <>\n+      struct thread_api<float> {\n+\n+\t\n+\tstatic int init_threads() {\n+\t  int res = fftwf_init_threads();\n+\t  return res;\n+\t}\n+\n+\tstatic void plan_with_threads(int nthreads = -1){\n+\n+\t  int av_procs = std::thread::hardware_concurrency();\n+\t  \n+\t  if(nthreads<1 || nthreads>av_procs)\n+\t    nthreads = av_procs;\n+\n+\t  fftwf_plan_with_nthreads(nthreads);\n+\t    \n+\t}\n+\n+\tstatic void cleanup_threads(){\n+\t  fftwf_cleanup_threads();\n+\t}\n+\t\n+      };\n+\n+    \n+      enum fftw_direction {\n+\tbackward = FFTW_BACKWARD,\n+\tforward = FFTW_FORWARD\n+      };\n+\n+    \n+      template<typename T_Precision=float>\n+      struct plan\n+      {\n+\tusing ComplexType = fftwf_complex;\n+\tusing RealType = float;\n+\tusing PlanType = fftwf_plan;\n+\n+\tstatic void execute(const PlanType _plan){\n+\t  fftwf_execute(_plan);\n+\t}\n+\n+\tstatic void destroy(PlanType _plan){\n+\t  fftwf_destroy_plan(_plan);\n+\t}\n+\n+\ttemplate <size_t NDims>\n+\tstatic PlanType create(const std::array<std::size_t,NDims>& _shape,\n+\t\t\t     RealType* _in,\n+\t\t\t     ComplexType* _out,\n+\t\t\t     fftw_direction _dir = forward){\n+\t  return fftwf_plan_dft_r2c(NDims,\n+\t\t\t\t    (int*)_shape.data(),\n+\t\t\t\t    _in,\n+\t\t\t\t    _out,\n+\t\t\t\t    FFTW_MEASURE );\n+\t}\n+\n+\ttemplate <size_t NDims>\n+\tstatic PlanType create(const std::array<std::size_t,NDims>& _shape,\n+\t\t\t     ComplexType* _in,\n+\t\t\t     RealType* _out,\n+\t\t\t     fftw_direction _dir = forward){\n+\t  return fftwf_plan_dft_c2r(NDims,\n+\t\t\t\t    (int*)_shape.data(),\n+\t\t\t\t    _in,\n+\t\t\t\t    _out, FFTW_MEASURE );\n+\t}\n+\t\n+\ttemplate <size_t NDims>\n+\tstatic PlanType create(const std::array<std::size_t,NDims>& _shape,\n+\t\t\t     ComplexType* _in,\n+\t\t\t     ComplexType* _out,\n+\t\t\t     fftw_direction _dir = forward){\n+\t  return fftwf_plan_dft(NDims,\n+\t\t\t\t(int*)_shape.data(),\n+\t\t\t\t_in,\n+\t\t\t\t_out,\n+\t\t\t\t_dir, FFTW_MEASURE );\n+\t}\n+\t// //1D\n+\t// static PlanType plan(const std::array<std::size_t,1>& _shape,\n+\t// \t\t     RealType* _in,\n+\t// \t\t     ComplexType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftwf_plan_dft_r2c(1,\n+\t// \t\t\t    _shape[0],\n+\t// \t\t\t    _in,\n+\t// \t\t\t    _out, FFTW_MEASURE );\n+\t// }\n+      \n+\t// static PlanType plan(const std::array<std::size_t,1>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     RealType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftwf_plan_dft_c2r(1,\n+\t// \t\t\t    _shape[0],\n+\t// \t\t\t    _in,\n+\t// \t\t\t    _out, FFTW_MEASURE );\n+\t// }      \n+\n+\t// static PlanType plan(const std::array<std::size_t,1>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     ComplexType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftwf_plan_dft(1,\n+\t// \t\t\t_shape[0],\n+\t// \t\t\t_in,\n+\t// \t\t\t_out,\n+\t// \t\t\t_dir, FFTW_MEASURE );\n+\t// }      \n+\n+\t// //2D\n+\t// static PlanType plan(const std::array<std::size_t,2>& _shape,\n+\t// \t\t     RealType* _in,\n+\t// \t\t     ComplexType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftwf_plan_dft_r2c(2,\n+\t// \t\t\t    _shape[1],_shape[0],\n+\t// \t\t\t    _in,\n+\t// \t\t\t    _out, FFTW_MEASURE );\n+\t// }\n+      \n+\t// static PlanType plan(const std::array<std::size_t,2>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     RealType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftwf_plan_dft_c2r(2,\n+\t// \t\t\t    _shape[1],_shape[0],\n+\t// \t\t\t    _in,\n+\t// \t\t\t    _out, FFTW_MEASURE );\n+\t// }      \n+\n+\t// static PlanType plan(const std::array<std::size_t,2>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     ComplexType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftwf_plan_dft(2,\n+\t// \t\t\t_shape[1],_shape[0],\n+\t// \t\t\t_in,\n+\t// \t\t\t_out,\n+\t// \t\t\t_dir, FFTW_MEASURE );\n+\t// }\n+\n+\t// //3D      \n+\t// static PlanType plan(const std::array<std::size_t,3>& _shape,\n+\t// \t\t     RealType* _in,\n+\t// \t\t     ComplexType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftwf_plan_dft_r2c(3,\n+\t// \t\t\t    _shape[2],_shape[1],_shape[0],\n+\t// \t\t\t    _in,\n+\t// \t\t\t    _out, FFTW_MEASURE );\n+\t// }\n+      \n+\t// static PlanType plan(const std::array<std::size_t,3>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     RealType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftwf_plan_dft_c2r(3,\n+\t// \t\t\t    _shape[2],_shape[1],_shape[0],\n+\t// \t\t\t    _in,\n+\t// \t\t\t    _out, FFTW_MEASURE );\n+\t// }      \n+\n+\t// static PlanType plan(const std::array<std::size_t,3>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     ComplexType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftwf_plan_dft(3,\n+\t// \t\t\t_shape[2],_shape[1],_shape[0],\n+\t// \t\t\t_in,\n+\t// \t\t\t_out,\n+\t// \t\t\t_dir, FFTW_MEASURE );\n+\t// }\n+\t// //ND\n+\t\n+      };\n+\n+      template<>\n+      struct plan<double>\n+      {\n+\tusing ComplexType = fftw_complex;\n+\tusing RealType = double;\n+\tusing PlanType = fftw_plan;\n+\n+\tstatic void execute(const PlanType _plan){\n+\t  fftw_execute(_plan);\n+\t}\n+\n+\tstatic void destroy(PlanType _plan){\n+\t  fftw_destroy_plan(_plan);\n+\t}\n+\n+\t// //ND\n+\ttemplate <size_t NDims>\n+\tstatic PlanType create(const std::array<std::size_t,NDims>& _shape,\n+\t\t\t     RealType* _in,\n+\t\t\t     ComplexType* _out,\n+\t\t\t     fftw_direction _dir = forward){\n+\t  return fftw_plan_dft_r2c(NDims,\n+\t\t\t\t    (int*)_shape.data(),\n+\t\t\t\t    _in,\n+\t\t\t\t    _out,\n+\t\t\t\t    FFTW_MEASURE );\n+\t}\n+\n+\ttemplate <size_t NDims>\n+\tstatic PlanType create(const std::array<std::size_t,NDims>& _shape,\n+\t\t\t     ComplexType* _in,\n+\t\t\t     RealType* _out,\n+\t\t\t     fftw_direction _dir = forward){\n+\t  return fftw_plan_dft_c2r(NDims,\n+\t\t\t\t    (int*)_shape.data(),\n+\t\t\t\t    _in,\n+\t\t\t\t    _out, FFTW_MEASURE );\n+\t}\n+\t\n+\ttemplate <size_t NDims>\n+\tstatic PlanType create(const std::array<std::size_t,NDims>& _shape,\n+\t\t\t     ComplexType* _in,\n+\t\t\t     ComplexType* _out,\n+\t\t\t     fftw_direction _dir = forward){\n+\t  return fftw_plan_dft(NDims,\n+\t\t\t\t(int*)_shape.data(),\n+\t\t\t\t_in,\n+\t\t\t\t_out,\n+\t\t\t\t_dir, FFTW_MEASURE );\n+\t}\n+\t\n+\t//1D\n+\t// static PlanType create(const std::array<std::size_t,1>& _shape,\n+\t// \t\t     RealType* _in,\n+\t// \t\t     ComplexType* _out ,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftw_plan_dft_r2c(1,\n+\t// \t\t\t   _shape.data(),\n+\t// \t\t\t   _in,\n+\t// \t\t\t   _out,\n+\t// \t\t\t   FFTW_MEASURE );\n+\t// }\n+      \n+\t// static PlanType create(const std::array<std::size_t,1>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     RealType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftw_plan_dft_c2r(1,\n+\t// \t\t\t   _shape[0],\n+\t// \t\t\t   _in,\n+\t// \t\t\t   _out, FFTW_MEASURE );\n+\t// }      \n+\n+\t// static PlanType create(const std::array<std::size_t,1>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     ComplexType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftw_plan_dft(1,\n+\t// \t\t       _shape[0],\n+\t// \t\t       _in,\n+\t// \t\t       _out,\n+\t// \t\t       _dir, FFTW_MEASURE );\n+\t// }      \n+\n+\t// //2D\n+\t// static PlanType create(const std::array<std::size_t,2>& _shape,\n+\t// \t\t     RealType* _in,\n+\t// \t\t     ComplexType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftw_plan_dft_r2c(2,\n+\t// \t\t\t   _shape[1],_shape[0],\n+\t// \t\t\t   _in,\n+\t// \t\t\t   _out, FFTW_MEASURE );\n+\t// }\n+      \n+\t// static PlanType create(const std::array<std::size_t,2>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     RealType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftw_plan_dft_c2r(2,\n+\t// \t\t\t   _shape[1],_shape[0],\n+\t// \t\t\t   _in,\n+\t// \t\t\t   _out, FFTW_MEASURE );\n+\t// }      \n+\n+\t// static PlanType create(const std::array<std::size_t,2>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     ComplexType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftw_plan_dft(2,\n+\t// \t\t       _shape[1],_shape[0],\n+\t// \t\t       _in,\n+\t// \t\t       _out,\n+\t// \t\t       _dir, FFTW_MEASURE );\n+\t// }\n+\n+\t// //3D      \n+\t// static PlanType create(const std::array<std::size_t,3>& _shape,\n+\t// \t\t     RealType* _in,\n+\t// \t\t     ComplexType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftw_plan_dft_r2c(3,\n+\t// \t\t\t   _shape[2],_shape[1],_shape[0],\n+\t// \t\t\t   _in,\n+\t// \t\t\t   _out, FFTW_MEASURE );\n+\t// }\n+      \n+\t// static PlanType create(const std::array<std::size_t,3>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     RealType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftw_plan_dft_c2r(3,\n+\t// \t\t\t   _shape[2],_shape[1],_shape[0],\n+\t// \t\t\t   _in,\n+\t// \t\t\t   _out, FFTW_MEASURE );\n+\t// }      \n+\n+\t// static PlanType create(const std::array<std::size_t,3>& _shape,\n+\t// \t\t     ComplexType* _in,\n+\t// \t\t     ComplexType* _out,\n+\t// \t\t     fftw_direction _dir = forward){\n+\t//   return fftw_plan_dft(3,\n+\t// \t\t       _shape[2],_shape[1],_shape[0],\n+\t// \t\t       _in,\n+\t// \t\t       _out,\n+\t// \t\t       _dir, FFTW_MEASURE );\n+\t// }\n+      };\n+    }  // namespace traits\n+\n+    /**\n+     * FFTW implicit context init and reset wrapper. Time is benchmarked.\n+     */\n+    struct Context {\n+\n+      static const std::string title() {\n+\treturn \"Fftw\";\n+      }\n+\n+      std::string getDeviceInfos() {\n+\t//obtain number of processors\n+      \n+\tstd::ostringstream msg;\n+\tmsg << std::thread::hardware_concurrency() << \"xCPU\";\n+\treturn msg.str();\n+      }\n+\n+      void create() {\n+\t//TODO: set number of threads\n+      \n+      }\n+\n+      void destroy() {\n+      \n+\t//not needed\n+      }\n+    };\n+\n+\n+    /**\n+     * Fftw plan and execution class.\n+     *\n+     * This class handles:\n+     * - {1D, 2D, 3D} x {R2C, C2R, C2C} x {inplace, outplace} x {float, double}.\n+     */\n+    template<typename TFFT, // see fft_abstract.hpp (FFT_Inplace_Real, ...)\n+\t     typename TPrecision, // double, float\n+\t     size_t   NDim // 1..3\n+\t     >\n+    struct FftwImpl\n+    {\n+\n+      //////////////////////////////////////////////////////////////////////////////////////\n+      // COMPILE TIME FIELDS\n+    \n+      using Extent = std::array<std::size_t,(int)NDim>;\n+      using Api  = typename traits::plan<TPrecision>;\n+      using ComplexType = typename traits::plan<TPrecision>::ComplexType;\n+      using RealType = typename traits::plan<TPrecision>::RealType;\n+      using PlanType = typename traits::plan<TPrecision>::PlanType;\n+    \n+      // using FFTExecuteForward  = typename traits::plan::FFTExecuteForward;\n+      // using FFTExecuteBackward = typename traits::plan::FFTExecuteBackward;\n+\n+      static constexpr\n+      bool IsInplace = TFFT::IsInplace;\n+      static constexpr\n+      bool IsComplex = TFFT::IsComplex;\n+      static constexpr\n+      bool Padding = IsInplace && IsComplex==false && NDim>1;\n+\n+      using value_type  = typename std::conditional<IsComplex,ComplexType,RealType>::type;\n+    \n+      // static constexpr\n+      //  fftwType FFTForward  = IsComplex ? traits::plan::FFTComplex : traits::plan::FFTForward;\n+      // static constexpr\n+      //  fftwType FFTBackward = IsComplex ? traits::plan::FFTComplex : traits::plan::FFTBackward;\n+\n+      //////////////////////////////////////////////////////////////////////////////////////\n+      // RUNTIME TIME FIELDS\n+    \n+      size_t n_;        // =[1]*..*[dim]\n+      size_t n_padded_; // =[1]*..*[dim-1]*([dim]/2+1)\n+      Extent extents_;\n+\n+      PlanType\t\t\tplan_           ;\n+      value_type*\t\tdata_           = nullptr;\n+      ComplexType*       \tdata_transform_ = nullptr; // intermediate buffer\n+      size_t             \tdata_size_;\n+      size_t             \tdata_transform_size_;\n+\n+      FftwImpl(const Extent& cextents)\n+\t: n_(0),\n+\t  n_padded_(0),\n+\t  extents_(),\n+\t  plan_(),\n+\t  data_(nullptr),\n+\t  data_transform_(nullptr),\n+\t  data_size_(0),\n+\t  data_transform_size_(0)\n+      {\n+\textents_ = interpret_as::column_major(cextents);\n+\t\n+\tn_ = std::accumulate(extents_.begin(),\n+\t\t\t     extents_.end(),\n+\t\t\t     1,\n+\t\t\t     std::multiplies<unsigned>());","path":"inc/fftw.hpp","position":498,"original_position":498,"commit_id":"d2b2fd69348992256802fc5c2aa95fb8504fb5b8","original_commit_id":"d2b2fd69348992256802fc5c2aa95fb8504fb5b8","user":{"login":"tdd11235813","id":16594217,"avatar_url":"https://avatars.githubusercontent.com/u/16594217?v=3","gravatar_id":"","url":"https://api.github.com/users/tdd11235813","html_url":"https://github.com/tdd11235813","followers_url":"https://api.github.com/users/tdd11235813/followers","following_url":"https://api.github.com/users/tdd11235813/following{/other_user}","gists_url":"https://api.github.com/users/tdd11235813/gists{/gist_id}","starred_url":"https://api.github.com/users/tdd11235813/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tdd11235813/subscriptions","organizations_url":"https://api.github.com/users/tdd11235813/orgs","repos_url":"https://api.github.com/users/tdd11235813/repos","events_url":"https://api.github.com/users/tdd11235813/events{/privacy}","received_events_url":"https://api.github.com/users/tdd11235813/received_events","type":"User","site_admin":false},"body":"unsigned -> size_t (comes from my older branch, sed did not get this one)","created_at":"2016-08-12T15:25:17Z","updated_at":"2016-08-12T15:25:17Z","html_url":"https://github.com/mpicbg-scicomp/gearshifft/pull/28#discussion_r74609708","pull_request_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/28","_links":{"self":{"href":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/comments/74609708"},"html":{"href":"https://github.com/mpicbg-scicomp/gearshifft/pull/28#discussion_r74609708"},"pull_request":{"href":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/28"}}},"pull_request":{"url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/28","id":81112884,"html_url":"https://github.com/mpicbg-scicomp/gearshifft/pull/28","diff_url":"https://github.com/mpicbg-scicomp/gearshifft/pull/28.diff","patch_url":"https://github.com/mpicbg-scicomp/gearshifft/pull/28.patch","issue_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/issues/28","number":28,"state":"open","locked":false,"title":"Adding fftw","user":{"login":"psteinb","id":1465603,"avatar_url":"https://avatars.githubusercontent.com/u/1465603?v=3","gravatar_id":"","url":"https://api.github.com/users/psteinb","html_url":"https://github.com/psteinb","followers_url":"https://api.github.com/users/psteinb/followers","following_url":"https://api.github.com/users/psteinb/following{/other_user}","gists_url":"https://api.github.com/users/psteinb/gists{/gist_id}","starred_url":"https://api.github.com/users/psteinb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/psteinb/subscriptions","organizations_url":"https://api.github.com/users/psteinb/orgs","repos_url":"https://api.github.com/users/psteinb/repos","events_url":"https://api.github.com/users/psteinb/events{/privacy}","received_events_url":"https://api.github.com/users/psteinb/received_events","type":"User","site_admin":false},"body":"added float32 and float64 support for fftw, I based the implementation of fftw on cufft\r\nthere are still a couple of issues:\r\n\r\n1) shall we make the number of threads a runtime configurable variable (right now I am simply using all cores available), if we want to do this, the question is how!\r\n2) estimating the plan size does not work with fftw by design (I return `0 bytes` for now)\r\n3) I am using FFTW_MEASURE for now, we could make this a runtime configurable as well or a simple compile time flag.","created_at":"2016-08-12T12:43:17Z","updated_at":"2016-08-12T15:25:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4536f38c36f85e41f2067c1346195fe14e687fdc","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/28/commits","review_comments_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/28/comments","review_comment_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/issues/28/comments","statuses_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/statuses/d2b2fd69348992256802fc5c2aa95fb8504fb5b8","head":{"label":"psteinb:adding_fftw","ref":"adding_fftw","sha":"d2b2fd69348992256802fc5c2aa95fb8504fb5b8","user":{"login":"psteinb","id":1465603,"avatar_url":"https://avatars.githubusercontent.com/u/1465603?v=3","gravatar_id":"","url":"https://api.github.com/users/psteinb","html_url":"https://github.com/psteinb","followers_url":"https://api.github.com/users/psteinb/followers","following_url":"https://api.github.com/users/psteinb/following{/other_user}","gists_url":"https://api.github.com/users/psteinb/gists{/gist_id}","starred_url":"https://api.github.com/users/psteinb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/psteinb/subscriptions","organizations_url":"https://api.github.com/users/psteinb/orgs","repos_url":"https://api.github.com/users/psteinb/repos","events_url":"https://api.github.com/users/psteinb/events{/privacy}","received_events_url":"https://api.github.com/users/psteinb/received_events","type":"User","site_admin":false},"repo":{"id":60612541,"name":"gearshifft","full_name":"psteinb/gearshifft","owner":{"login":"psteinb","id":1465603,"avatar_url":"https://avatars.githubusercontent.com/u/1465603?v=3","gravatar_id":"","url":"https://api.github.com/users/psteinb","html_url":"https://github.com/psteinb","followers_url":"https://api.github.com/users/psteinb/followers","following_url":"https://api.github.com/users/psteinb/following{/other_user}","gists_url":"https://api.github.com/users/psteinb/gists{/gist_id}","starred_url":"https://api.github.com/users/psteinb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/psteinb/subscriptions","organizations_url":"https://api.github.com/users/psteinb/orgs","repos_url":"https://api.github.com/users/psteinb/repos","events_url":"https://api.github.com/users/psteinb/events{/privacy}","received_events_url":"https://api.github.com/users/psteinb/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/psteinb/gearshifft","description":"Benchmark Suite for Heterogenuous FFT Implementations","fork":true,"url":"https://api.github.com/repos/psteinb/gearshifft","forks_url":"https://api.github.com/repos/psteinb/gearshifft/forks","keys_url":"https://api.github.com/repos/psteinb/gearshifft/keys{/key_id}","collaborators_url":"https://api.github.com/repos/psteinb/gearshifft/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/psteinb/gearshifft/teams","hooks_url":"https://api.github.com/repos/psteinb/gearshifft/hooks","issue_events_url":"https://api.github.com/repos/psteinb/gearshifft/issues/events{/number}","events_url":"https://api.github.com/repos/psteinb/gearshifft/events","assignees_url":"https://api.github.com/repos/psteinb/gearshifft/assignees{/user}","branches_url":"https://api.github.com/repos/psteinb/gearshifft/branches{/branch}","tags_url":"https://api.github.com/repos/psteinb/gearshifft/tags","blobs_url":"https://api.github.com/repos/psteinb/gearshifft/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/psteinb/gearshifft/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/psteinb/gearshifft/git/refs{/sha}","trees_url":"https://api.github.com/repos/psteinb/gearshifft/git/trees{/sha}","statuses_url":"https://api.github.com/repos/psteinb/gearshifft/statuses/{sha}","languages_url":"https://api.github.com/repos/psteinb/gearshifft/languages","stargazers_url":"https://api.github.com/repos/psteinb/gearshifft/stargazers","contributors_url":"https://api.github.com/repos/psteinb/gearshifft/contributors","subscribers_url":"https://api.github.com/repos/psteinb/gearshifft/subscribers","subscription_url":"https://api.github.com/repos/psteinb/gearshifft/subscription","commits_url":"https://api.github.com/repos/psteinb/gearshifft/commits{/sha}","git_commits_url":"https://api.github.com/repos/psteinb/gearshifft/git/commits{/sha}","comments_url":"https://api.github.com/repos/psteinb/gearshifft/comments{/number}","issue_comment_url":"https://api.github.com/repos/psteinb/gearshifft/issues/comments{/number}","contents_url":"https://api.github.com/repos/psteinb/gearshifft/contents/{+path}","compare_url":"https://api.github.com/repos/psteinb/gearshifft/compare/{base}...{head}","merges_url":"https://api.github.com/repos/psteinb/gearshifft/merges","archive_url":"https://api.github.com/repos/psteinb/gearshifft/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/psteinb/gearshifft/downloads","issues_url":"https://api.github.com/repos/psteinb/gearshifft/issues{/number}","pulls_url":"https://api.github.com/repos/psteinb/gearshifft/pulls{/number}","milestones_url":"https://api.github.com/repos/psteinb/gearshifft/milestones{/number}","notifications_url":"https://api.github.com/repos/psteinb/gearshifft/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/psteinb/gearshifft/labels{/name}","releases_url":"https://api.github.com/repos/psteinb/gearshifft/releases{/id}","deployments_url":"https://api.github.com/repos/psteinb/gearshifft/deployments","created_at":"2016-06-07T12:48:18Z","updated_at":"2016-06-07T12:48:57Z","pushed_at":"2016-08-12T12:37:49Z","git_url":"git://github.com/psteinb/gearshifft.git","ssh_url":"git@github.com:psteinb/gearshifft.git","clone_url":"https://github.com/psteinb/gearshifft.git","svn_url":"https://github.com/psteinb/gearshifft","homepage":"","size":640,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"mpicbg-scicomp:master","ref":"master","sha":"d2ccdb5be20c8b3b0e7770bc3bd74ecd3cfff811","user":{"login":"mpicbg-scicomp","id":11978740,"avatar_url":"https://avatars.githubusercontent.com/u/11978740?v=3","gravatar_id":"","url":"https://api.github.com/users/mpicbg-scicomp","html_url":"https://github.com/mpicbg-scicomp","followers_url":"https://api.github.com/users/mpicbg-scicomp/followers","following_url":"https://api.github.com/users/mpicbg-scicomp/following{/other_user}","gists_url":"https://api.github.com/users/mpicbg-scicomp/gists{/gist_id}","starred_url":"https://api.github.com/users/mpicbg-scicomp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mpicbg-scicomp/subscriptions","organizations_url":"https://api.github.com/users/mpicbg-scicomp/orgs","repos_url":"https://api.github.com/users/mpicbg-scicomp/repos","events_url":"https://api.github.com/users/mpicbg-scicomp/events{/privacy}","received_events_url":"https://api.github.com/users/mpicbg-scicomp/received_events","type":"Organization","site_admin":false},"repo":{"id":60610005,"name":"gearshifft","full_name":"mpicbg-scicomp/gearshifft","owner":{"login":"mpicbg-scicomp","id":11978740,"avatar_url":"https://avatars.githubusercontent.com/u/11978740?v=3","gravatar_id":"","url":"https://api.github.com/users/mpicbg-scicomp","html_url":"https://github.com/mpicbg-scicomp","followers_url":"https://api.github.com/users/mpicbg-scicomp/followers","following_url":"https://api.github.com/users/mpicbg-scicomp/following{/other_user}","gists_url":"https://api.github.com/users/mpicbg-scicomp/gists{/gist_id}","starred_url":"https://api.github.com/users/mpicbg-scicomp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mpicbg-scicomp/subscriptions","organizations_url":"https://api.github.com/users/mpicbg-scicomp/orgs","repos_url":"https://api.github.com/users/mpicbg-scicomp/repos","events_url":"https://api.github.com/users/mpicbg-scicomp/events{/privacy}","received_events_url":"https://api.github.com/users/mpicbg-scicomp/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mpicbg-scicomp/gearshifft","description":"Benchmark Suite for Heterogenuous FFT Implementations","fork":false,"url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft","forks_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/forks","keys_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/teams","hooks_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/hooks","issue_events_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/issues/events{/number}","events_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/events","assignees_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/assignees{/user}","branches_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/branches{/branch}","tags_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/tags","blobs_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/git/refs{/sha}","trees_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/statuses/{sha}","languages_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/languages","stargazers_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/stargazers","contributors_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/contributors","subscribers_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/subscribers","subscription_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/subscription","commits_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/commits{/sha}","git_commits_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/git/commits{/sha}","comments_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/comments{/number}","issue_comment_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/issues/comments{/number}","contents_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/contents/{+path}","compare_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/merges","archive_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/downloads","issues_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/issues{/number}","pulls_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls{/number}","milestones_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/milestones{/number}","notifications_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/labels{/name}","releases_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/releases{/id}","deployments_url":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/deployments","created_at":"2016-06-07T12:05:19Z","updated_at":"2016-06-07T12:49:19Z","pushed_at":"2016-08-12T12:43:18Z","git_url":"git://github.com/mpicbg-scicomp/gearshifft.git","ssh_url":"git@github.com:mpicbg-scicomp/gearshifft.git","clone_url":"https://github.com/mpicbg-scicomp/gearshifft.git","svn_url":"https://github.com/mpicbg-scicomp/gearshifft","homepage":"","size":621,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":9,"forks":2,"open_issues":9,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/28"},"html":{"href":"https://github.com/mpicbg-scicomp/gearshifft/pull/28"},"issue":{"href":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/issues/28"},"comments":{"href":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/issues/28/comments"},"review_comments":{"href":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/28/comments"},"review_comment":{"href":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/pulls/28/commits"},"statuses":{"href":"https://api.github.com/repos/mpicbg-scicomp/gearshifft/statuses/d2b2fd69348992256802fc5c2aa95fb8504fb5b8"}}}}
{"actor":{"display_login":"tdd11235813"}}