===== SPM SkePU sample code ===== === Containers === Illustrates the usage of Vectors and Matrixes. To execute the code: * on CPU: compile it using g++ -I skepuinclude containers.cpp -o cpu_containers * on GPU: uncomment the macro defining SKEPU_CUDA and compile with nvcc -I skepuinclude containers.cu -o gpu_containers #include //#define SKEPU_CUDA #include "skepu/vector.h" #include "skepu/matrix.h" #define N 16 #define M 16 using namespace std; int main() { skepu::Vector v(N,0.0); skepu::Matrix m(N,M,0.0); cout << "Initialized matrix and vector" << endl; for(int i=0; i #include #define SKEPU_CUDA #include "skepu/vector.h" #include "skepu/matrix.h" #include "skepu/map.h" using namespace std; // definition of functions to be used in the map and reduce UNARY_FUNC(inc, int, a, return(a+1); ) UNARY_FUNC(dec, int, a, return(a-1); ) UNARY_FUNC(sq, int, a, return(a*a); ) BINARY_FUNC(add, int, a, b, return(a+b); ) BINARY_FUNC(sub, int, a, b, return(a-b); ) BINARY_FUNC(mul, int, a, b, return(a*b); ) BINARY_FUNC(div, int, a, b, return(a/b); ) #define N 4 int main() { // declare vectors skepu::Vector v0(N); skepu::Vector v1(N); skepu::Vector v2(N); // initialize the vector(s) to some meaningful value for(int i=0; i sqmap(new sq); sqmap(v0,v2); cout << "After sqmap: " << v2 << endl; // two input map: forall i compute f(v0[i],v1[i]) // same as: alpha(f) o zip skepu::Map mapzip(new add); mapzip(v0,v1,v2); cout << "After mapzip: " << v2 << endl; return 0; } === Sample reduce ==== #include #include "skepu/vector.h" #include "skepu/matrix.h" #include "skepu/reduce.h" using namespace std; // definition of functions to be used in the map and reduce UNARY_FUNC(inc, int, a, return(a+1); ) UNARY_FUNC(dec, int, a, return(a-1); ) UNARY_FUNC(sq, int, a, return(a*a); ) BINARY_FUNC(add, int, a, b, return(a+b); ) BINARY_FUNC(sub, int, a, b, return(a-b); ) BINARY_FUNC(mul, int, a, b, return(a*b); ) BINARY_FUNC(div, int, a, b, return(a/b); ) #define N 4 int main() { // declare vectors skepu::Vector v0(N); skepu::Matrix m(N,N); // initialize the vector(s) to some meaningful value for(int i=0; i reduceadd(new add); int i = reduceadd(v0); cout << "After reduceadd : " << i << endl; skepu::Reduce reduceaddmat(new add); i = reduceaddmat(m); cout << "After reduceaddmat : " << i << endl; return 0; } === Sample stencil (mapoverlap) ==== #include #include "skepu/vector.h" #include "skepu/matrix.h" #include "skepu/mapoverlap.h" using namespace std; OVERLAP_FUNC(avg, float, 1, a, return((a[-1]+a[0]+a[1])/3); ) #define N 8 int main() { // declare vectors skepu::Vector v0(N); skepu::Vector v2(N); // initialize the vector(s) to some meaningful value for(int i=0; i average(new avg); // in vecs, missing boundary filled with 1 (CONSTANT) average(v0,v2,skepu::CONSTANT, (float)1 ); cout << "After average (boundary = 1): " << v2 << endl; // consider the vector as a torus average(v0,v2,skepu::CYCLIC); cout << "After average (cyclic): " << v2 << endl; return 0; } === Sample maparray ==== #include #include "skepu/vector.h" #include "skepu/matrix.h" #include "skepu/maparray.h" using namespace std; // definition of functions to be used in the map and reduce #define N 4 ARRAY_FUNC(f,int, a, b, { int s = 0; \ for(int i=0; i v0(N); skepu::Vector v1(N); skepu::Vector v2(N); // initialize the vector(s) to some meaningful value for(int i=0; i ff(new f); ff(v0,v1,v2); cout << "After ff: " << v2 << endl; return 0; } === Sample scan ==== #include #include "skepu/vector.h" #include "skepu/matrix.h" #include "skepu/scan.h" using namespace std; // definition of functions to be used in the map and reduce BINARY_FUNC(add, float, a, b, return(a+b); ) BINARY_FUNC(mul, float, a, b, return(a*b); ) #define N 4 int main() { // declare vectors skepu::Vector v0(N); skepu::Vector v1(N); skepu::Vector v2(N); // initialize the vector(s) to some meaningful value for(int i=0; i scanadd(new add); // at pos i sum of items up to (i) scanadd(v0,v2,skepu::INCLUSIVE); cout << "After scanadd: " << v2 << endl; // at pos i sum of items up to (i-1) scanadd(v0,v2,skepu::EXCLUSIVE); cout << "After scanadd: " << v2 << endl; return 0; }