<p>Welcome to ArrayFire's home page for GSOC 2015. Please read this document and <a href="http://www.google-melange.com/gsoc/document/show/gsoc_program/google/gsoc2014/help_page#1._Are_there_any_age_restrictions_on">GSOC's FAQ</a> before making a proposal. You can contact ArrayFire developers and mentors using our <a href="https://groups.google.com/forum/#!forum/arrayfire-users">mailing list</a> for more information.</p>

<h2>Information for students</h2>

<h4>About ArrayFire</h4>

<p><a href="https://github.com/arrayfire/arrayfire">ArrayFire</a> is a high performance software library for parallel computing with an easy-to-use API. Its array based function set makes parallel programming simple.</p>

<p>ArrayFire's multiple backends (CUDA, OpenCL and native CPU) make it platform independent and highly portable. A few lines of code in ArrayFire can replace dozens of lines of parallel computing code.</p>

<h4>Requirements</h4>

<p>While none of the following requirements are mandatory, we do a lot of development in <strong>C</strong> and <strong>C++</strong>. Familiarity with those languages would go a long way in addition to the following domains.</p>

<ul>
<li>Statistics / Machine Learning tools and libraries (e.g. R, scikit, numpy, etc.)</li>
<li>Image processing and Computer Vision</li>
<li>Experience programming on GPUs (CUDA / OpenCL, or OpenGL / DirectX)</li>
<li>Version Control systems (git)</li>
<li>Or a general interest in scientific computing.</li>
</ul>

<h4>Guidelines</h4>

<p>If a project listed here interests you, or if you want to propose a new project, contact the mentors using our <a href="https://groups.google.com/forum/#!forum/arrayfire-users">mailing list</a> with your project proposal.</p>

<h2>ArrayFire Projects and Ideas</h2>

<p>We will provide remote access to the hardware relevant to the project if necessary.</p>

<h4>Improvements to the ArrayFire Library</h4>

<p><strong>Mentors:</strong> Pavan Yalamanchili, Pradeep Garigipati, Shehzan Mohammed</p>

<p>ArrayFire aims to be a portable, high performance scientific computing library. Key areas in ArrayFire can be improved include:</p>

<ul>
<li>Improving the performance of existing functions</li>
<li>Adding support for more hardware and backends</li>
<li>Adding a new domain of functions</li>
</ul>

<p>With these in mind, we suggest the follow ideas for prospective GSOC15 students.</p>

<h6>Implement parallel version of ArrayFire's CPU backend.</h6>

<p>This project focuses on performance improvements to ArrayFire's CPU backend. This is done by adding both vectorization and multi-threading support.</p>

<p>A successful project will implement the following tasks.</p>

<ul>
<li>Use existing libraries (MKL, ACML, IPP etc) to accelerate when possible.</li>
<li>Use SSE instructions to vectorize key algorithms</li>
<li>Use OpenMP to enable multi-threading support.</li>
</ul>

<h6>Porting ArrayFire OpenCL backend to work on Mobile Platforms</h6>

<p>ArrayFire's OpenCL backend is portable across a variety of OpenCL devices. However it has been developed and tested primarily on desktop GPUs. This project focuses on porting the OpenCL backend to mobile GPUs. Platforms of particular interest include ARM Mali GPUs, and Qualcomm's Adreno GPUs. The necessary hardware will be provided by us.</p>

<p>A successful project will implement the following tasks:</p>

<ul>
<li>Setup cmake framework to work on ArrayFire for Android devices</li>
<li>Make changes to ArrayFire's OpenCL backend to work on mobile devices</li>
<li>Make changes to ArrayFire's Java wrapper necessary for Android</li>
</ul>

<h6>Machine learning algorithms for ArrayFire</h6>

<p>These algorithms will be written using existing functionality. While no knowledge of CUDA or OpenCL is necessary, familiarity with vectorization concepts important. A successful project will implement any three of the following tasks using ArrayFire.</p>

<ul>
<li>Logistic and Linear regression</li>
<li>Expectation Maximization </li>
<li>Principal Component Analysis</li>
<li>Support Vector Machines</li>
<li>Hidden Markov Models</li>
<li>Self Organizing Maps</li>
<li>Performance improvements to existing Machine Learning algorithms</li>
</ul>

<h6>Computer vision algorithms for ArrayFire.</h6>

<p>These algorithms will be written in CUDA or OpenCL, along with a CPU implementation (serial), using ArrayFire existing functionality when available. A successful project will implement any one of the following tasks in CUDA or OpenCL plus a CPU implementation in C++:</p>

<ul>
<li><a href="http://personal.ee.surrey.ac.uk/Personal/Z.Kalal/tld.html">Tracking-Learning-Detection</a> (TLD)</li>
<li>Accelerated-KAZE Features (AKAZE): http://www.robesafe.com/personal/pablo.alcantarilla/kaze.html</li>
</ul>

<h4>Language Bindings for ArrayFire</h4>

<p>There are a lot of Scientists and Engineers using higher level languages for scientific computing. ArrayFire's C API allows us to write wrappers for high level languages fairly easily. GSOC students can pick a language of their choice and wrap ArrayFire in that language. Our suggestions include the following.</p>

<h6>Java Wrapper for ArrayFire</h6>

<p>A Java wrapper already exists for ArrayFire. However it does not have feature parity with the C/C++ version. A successful project will implement the following.</p>

<ul>
<li>Get feature parity with ArrayFire C/C++.</li>
<li>Test the wrapper on Linux, Windows and OSX.</li>
<li>Write two new examples demonstrating the wrapper.</li>
</ul>

<h6>R wrapper for ArrayFire</h6>

<p>As with the Java wrapper, the R wrapper does not have feature parity. A successful project will implement the following.</p>

<ul>
<li>Get feature parity with ArrayFire C/C++</li>
<li>Test the wrapper on Linux and OSX</li>
<li>Benchmark ArrayFire's algorithms with standard implementations in R.</li>
</ul>

<h6>Other language wrappers.</h6>

<p>Suggested languages include: C#, lua and javascript. If you prefer a different language, contact us. A successful project will implement the following.</p>

<ul>
<li>implement functions from <a href="https://github.com/arrayfire/arrayfire/blob/devel/include/af/algorithm.h">arith.h</a>, <a href="https://github.com/arrayfire/arrayfire/blob/devel/include/af/arith.h">algorithm.h</a> and <a href="https://github.com/arrayfire/arrayfire/blob/devel/include/af/blas.h">blas.h</a>.</li>
<li>Test the wrapper on Linux.</li>
<li>Write at least one example demonstrating the wrapper.</li>
</ul>

<h4>The ArrayFire Graphics Library - High performance visualizations</h4>

<p><strong>Mentors:</strong> Shehzan Mohammed, Pradeep Garigipati</p>

<p>The ArrayFire Graphics library is a set of visualization API that is targeted towards giving users a range of High performance visualization options.</p>

<p>The core ideas behind this library are as follows:</p>

<ul>
<li>Provide a robust, yet flexible, API that allows users to display their data.</li>
<li>Visualization options include, but are not limited to: 

<ul>
<li>Display 2D images</li>
<li>Display 2D and 3D Graphs using lines, points, sprites, surfaces and volumes</li>
<li>Display 3D voxel and voxel-like visualizations</li>
<li>Display 3D geometry</li>
</ul></li>
<li>Allow interop capabilities for both CUDA and OpenCL. This is essential as copying data from GPU to CPU and back to GPU for rendering is a whole lot of waste of performance.</li>
<li>Provide a set of useful keyboard and mouse interaction options.</li>
</ul>

<h6>Suggested ideas for GSOC15 for this project include:</h6>

<p>A successful project will include any one of the following:</p>

<ul>
<li>Create new visualization API. 2D Sprites based UI, 3D voxels, 3D graphs, and 3D geometry are favorites.</li>
<li>Performance improvements to existing API. This includes 

<ul>
<li>improvements to OpenGL code.</li>
<li>data copy performance in ArrayFire.</li>
</ul></li>
<li>Using multi-threading to run OpenGL on an independent thread.</li>
<li>Porting the library to OpenGL ES and/or WebGL.</li>
</ul>

<h6>Requirements for these project are as follows:</h6>

<ul>
<li>Extremely good knowledge of OpenGL, GLFW.</li>
<li>Experience with 3D Rendering using OpenGL.</li>
<li>Strong understanding of CUDA-OpenGL and/or OpenCL-OpenGL interop.</li>
<li>Knowledge of game and/or rendering engines is a bonus.</li>
</ul>
