<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>

<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>

<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>
<li>Platforms of interest include ARM Mali GPUs, and Qualcomm's Adreno GPUs</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 algorithms 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>
</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>

<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>

<h4>Language Bindings for ArrayFire</h4>

<p><strong>Mentors:</strong> Pavan Yalamanchili, Umar Arshad, Pradeep Garigipati</p>
