(5445,7,'2014-04-30 20:43:59','2014-04-30 20:43:59','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] Language support\r\n[icon type=\"angle-double-right\"] ArrayFire for Java (https://github.com/arrayfire/arrayfire_java)\r\n[icon type=\"angle-double-right\"] ArrayFire for R! (https://github.com/arrayfire/arrayfire_r)\r\n[icon type=\"angle-double-right\"] ArrayFire for Fortran (https://github.com/arrayfire/arrayfire_fortran)&lt;sup&gt;#&lt;/sup&gt;\r\n[icon type=\"angle-double-right\"] ArrayFire Extras on Github (https://github.com/arrayfire)\r\n[icon type=\"angle-double-right\"] All language wrappers\r\n[icon type=\"angle-double-right\"] Rolling updates to examples (https://github.com/arrayfire/arrayfire_examples)\r\n[icon type=\"angle-double-right\"] OpenGL interop example (https://github.com/arrayfire/arrayfire_opengl_interop)\r\n\r\n<em>Note: ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"angle-double-right\"] transform()\r\n[icon type=\"angle-double-right\"] affine and inverse affine transform of an image\r\n[icon type=\"angle-double-right\"] translate()\r\n[icon type=\"angle-double-right\"] translate an image using affine transforms\r\n[icon type=\"angle-double-right\"] scale()\r\n[icon type=\"angle-double-right\"] scale an image using affine transforms\r\n[icon type=\"angle-double-right\"] skew()\r\n[icon type=\"angle-double-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"angle-double-right\"] transform_coords()\r\n[icon type=\"angle-double-right\"] Upto 3D homogeneous transformations\r\n[icon type=\"angle-double-right\"] rotate_coords()\r\n[icon type=\"angle-double-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"angle-double-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] approx1() and approx2() now support nearest interpolation\r\n[icon type=\"angle-double-right\"] rotate(), resize(), convolve() work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] loadimage()\r\n[icon type=\"angle-double-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] gaussiankernel()\r\n[icon type=\"angle-double-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] resize()\r\n[icon type=\"angle-double-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] medfilt()\r\n[icon type=\"angle-double-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"angle-double-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] approx1()\r\n[icon type=\"angle-double-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] flip()\r\n[icon type=\"angle-double-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] rotate() rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-04-30 20:43:59','2014-04-30 20:43:59','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5446,7,'2014-05-01 13:47:54','2014-05-01 13:47:54','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support\r\n[icon type=\"caret-right\"] ArrayFire for Java (https://github.com/arrayfire/arrayfire_java)\r\n[icon type=\"caret-right\"] ArrayFire for R! (https://github.com/arrayfire/arrayfire_r)\r\n[icon type=\"caret-right\"] ArrayFire for Fortran (https://github.com/arrayfire/arrayfire_fortran)&lt;sup&gt;#&lt;/sup&gt;\r\n[icon type=\"angle-double-right\"] ArrayFire Extras on Github (https://github.com/arrayfire)\r\n[icon type=\"angle-double-right\"] All language wrappers\r\n[icon type=\"angle-double-right\"] Rolling updates to examples (https://github.com/arrayfire/arrayfire_examples)\r\n[icon type=\"angle-double-right\"] OpenGL interop example (https://github.com/arrayfire/arrayfire_opengl_interop)\r\n\r\n<em>Note: ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"angle-double-right\"] transform()\r\n[icon type=\"angle-double-right\"] affine and inverse affine transform of an image\r\n[icon type=\"angle-double-right\"] translate()\r\n[icon type=\"angle-double-right\"] translate an image using affine transforms\r\n[icon type=\"angle-double-right\"] scale()\r\n[icon type=\"angle-double-right\"] scale an image using affine transforms\r\n[icon type=\"angle-double-right\"] skew()\r\n[icon type=\"angle-double-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"angle-double-right\"] transform_coords()\r\n[icon type=\"angle-double-right\"] Upto 3D homogeneous transformations\r\n[icon type=\"angle-double-right\"] rotate_coords()\r\n[icon type=\"angle-double-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"angle-double-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] approx1() and approx2() now support nearest interpolation\r\n[icon type=\"angle-double-right\"] rotate(), resize(), convolve() work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] loadimage()\r\n[icon type=\"angle-double-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] gaussiankernel()\r\n[icon type=\"angle-double-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] resize()\r\n[icon type=\"angle-double-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] medfilt()\r\n[icon type=\"angle-double-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"angle-double-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] approx1()\r\n[icon type=\"angle-double-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] flip()\r\n[icon type=\"angle-double-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] rotate() rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 13:47:54','2014-05-01 13:47:54','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5447,7,'2014-05-01 13:48:43','2014-05-01 13:48:43','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support\r\n[icon type=\"caret-right\"] ArrayFire for Java (https://github.com/arrayfire/arrayfire_java)\r\n[icon type=\"caret-right\"] ArrayFire for R! (https://github.com/arrayfire/arrayfire_r)\r\n[icon type=\"caret-right\"] ArrayFire for Fortran (https://github.com/arrayfire/arrayfire_fortran)&lt;sup&gt;#&lt;/sup&gt;\r\n[icon type=\"angle-double-right\"] ArrayFire Extras on Github (https://github.com/arrayfire)\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] Rolling updates to examples (https://github.com/arrayfire/arrayfire_examples)\r\n[icon type=\"caret-right\"] OpenGL interop example (https://github.com/arrayfire/arrayfire_opengl_interop)\r\n\r\n<em>Note: ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"angle-double-right\"] transform()\r\n[icon type=\"angle-double-right\"] affine and inverse affine transform of an image\r\n[icon type=\"angle-double-right\"] translate()\r\n[icon type=\"angle-double-right\"] translate an image using affine transforms\r\n[icon type=\"angle-double-right\"] scale()\r\n[icon type=\"angle-double-right\"] scale an image using affine transforms\r\n[icon type=\"angle-double-right\"] skew()\r\n[icon type=\"angle-double-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"angle-double-right\"] transform_coords()\r\n[icon type=\"angle-double-right\"] Upto 3D homogeneous transformations\r\n[icon type=\"angle-double-right\"] rotate_coords()\r\n[icon type=\"angle-double-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"angle-double-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] approx1() and approx2() now support nearest interpolation\r\n[icon type=\"angle-double-right\"] rotate(), resize(), convolve() work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] loadimage()\r\n[icon type=\"angle-double-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] gaussiankernel()\r\n[icon type=\"angle-double-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] resize()\r\n[icon type=\"angle-double-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] medfilt()\r\n[icon type=\"angle-double-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"angle-double-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] approx1()\r\n[icon type=\"angle-double-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] flip()\r\n[icon type=\"angle-double-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] rotate() rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 13:48:43','2014-05-01 13:48:43','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5448,7,'2014-05-01 13:50:48','2014-05-01 13:50:48','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support\r\n[icon type=\"caret-right\"] ArrayFire for Java (https://github.com/arrayfire/arrayfire_java)\r\n[icon type=\"caret-right\"] ArrayFire for R! (https://github.com/arrayfire/arrayfire_r)\r\n[icon type=\"caret-right\"] ArrayFire for Fortran (https://github.com/arrayfire/arrayfire_fortran)&lt;sup&gt;#&lt;/sup&gt;\r\n[icon type=\"angle-double-right\"] ArrayFire Extras on Github (https://github.com/arrayfire)\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] Rolling updates to examples (https://github.com/arrayfire/arrayfire_examples)\r\n[icon type=\"caret-right\"] OpenGL interop example (https://github.com/arrayfire/arrayfire_opengl_interop)\r\n\r\n<em>Note: ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] transform()\r\n[icon type=\"chevron-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] translate()\r\n[icon type=\"chevron-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] scale()\r\n[icon type=\"chevron-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] skew()\r\n[icon type=\"chevron-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"chevron-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"chevron-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"angle-double-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] approx1() and approx2() now support nearest interpolation\r\n[icon type=\"angle-double-right\"] rotate(), resize(), convolve() work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] loadimage()\r\n[icon type=\"angle-double-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] gaussiankernel()\r\n[icon type=\"angle-double-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] resize()\r\n[icon type=\"angle-double-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] medfilt()\r\n[icon type=\"angle-double-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"angle-double-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] approx1()\r\n[icon type=\"angle-double-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] flip()\r\n[icon type=\"angle-double-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] rotate() rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 13:50:48','2014-05-01 13:50:48','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5449,7,'2014-05-01 13:52:18','2014-05-01 13:52:18','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support\r\n[icon type=\"caret-right\"] ArrayFire for Java (https://github.com/arrayfire/arrayfire_java)\r\n[icon type=\"caret-right\"] ArrayFire for R! (https://github.com/arrayfire/arrayfire_r)\r\n[icon type=\"caret-right\"] ArrayFire for Fortran (https://github.com/arrayfire/arrayfire_fortran)&lt;sup&gt;#&lt;/sup&gt;\r\n[icon type=\"angle-double-right\"] ArrayFire Extras on Github (https://github.com/arrayfire)\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] Rolling updates to examples (https://github.com/arrayfire/arrayfire_examples)\r\n[icon type=\"caret-right\"] OpenGL interop example (https://github.com/arrayfire/arrayfire_opengl_interop)\r\n\r\n<em>Note: ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] transform()\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] translate()\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] scale()\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] skew()\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"angle-double-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] approx1() and approx2() now support nearest interpolation\r\n[icon type=\"angle-double-right\"] rotate(), resize(), convolve() work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] loadimage()\r\n[icon type=\"angle-double-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] gaussiankernel()\r\n[icon type=\"angle-double-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] resize()\r\n[icon type=\"angle-double-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] medfilt()\r\n[icon type=\"angle-double-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"angle-double-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] approx1()\r\n[icon type=\"angle-double-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] flip()\r\n[icon type=\"angle-double-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] rotate() rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 13:52:18','2014-05-01 13:52:18','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5450,7,'2014-05-01 13:53:46','2014-05-01 13:53:46','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support\r\n[icon type=\"caret-right\"] ArrayFire for Java (https://github.com/arrayfire/arrayfire_java)\r\n[icon type=\"caret-right\"] ArrayFire for R! (https://github.com/arrayfire/arrayfire_r)\r\n[icon type=\"caret-right\"] ArrayFire for Fortran (https://github.com/arrayfire/arrayfire_fortran)&lt;sup&gt;#&lt;/sup&gt;\r\n[icon type=\"angle-double-right\"] ArrayFire Extras on Github (https://github.com/arrayfire)\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] Rolling updates to examples (https://github.com/arrayfire/arrayfire_examples)\r\n[icon type=\"caret-right\"] OpenGL interop example (https://github.com/arrayfire/arrayfire_opengl_interop)\r\n\r\n<em>Note: ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] transform()\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] translate()\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] scale()\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] skew()\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] approx1() and approx2() now support nearest interpolation\r\n[icon type=\"angle-double-right\"] rotate(), resize(), convolve() work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] loadimage()\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] gaussiankernel()\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] resize()\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] medfilt()\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] rotate()\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] approx1()\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] flip()\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] rotate() rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 13:53:46','2014-05-01 13:53:46','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5451,7,'2014-05-01 14:05:00','2014-05-01 14:05:00','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 14:05:00','2014-05-01 14:05:00','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5452,7,'2014-05-01 14:11:37','2014-05-01 14:11:37','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 14:11:37','2014-05-01 14:11:37','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5453,7,'2014-05-01 14:12:56','2014-05-01 14:12:56','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&amp;nbsp[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 14:12:56','2014-05-01 14:12:56','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5454,7,'2014-05-01 14:13:21','2014-05-01 14:13:21','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n<&nbsp>[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 14:13:21','2014-05-01 14:13:21','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5455,7,'2014-05-01 14:13:32','2014-05-01 14:13:32','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 14:13:32','2014-05-01 14:13:32','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5456,7,'2014-05-01 14:13:47','2014-05-01 14:13:47','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 14:13:47','2014-05-01 14:13:47','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5457,7,'2014-05-01 14:14:18','2014-05-01 14:14:18','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n5 &nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 14:14:18','2014-05-01 14:14:18','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5458,7,'2014-05-01 14:14:46','2014-05-01 14:14:46','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n5&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 14:14:46','2014-05-01 14:14:46','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5459,7,'2014-05-01 14:15:01','2014-05-01 14:15:01','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n(5 &nbsp;)[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 14:15:01','2014-05-01 14:15:01','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5460,7,'2014-05-01 14:15:36','2014-05-01 14:15:36','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 14:15:36','2014-05-01 14:15:36','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5461,7,'2014-05-01 14:18:15','2014-05-01 14:18:15','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] All language wrappers\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] translate an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] scale an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] transform_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] rotate_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-01 14:18:15','2014-05-01 14:18:15','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5464,7,'2014-05-01 17:28:25','0000-00-00 00:00:00','<span style=\"line-height: 1.5em;\">Adopting a new look is tough! Haircut, clothing style, glasses—whatever the change may be, finding the right fit is stressful. Glasses.com set out to improve the experience by providing customers a way of virtually trying on glasses in the comfort of their homes via smart phone or tablet.</span>\r\n\r\nThe Glasses.com app takes a picture of the user’s face, creates a 3D model of facial features, and virtually places selected frames on the user’s 3D image. The user is then free to view the 3D image from a wide variety of angles.\r\n\r\nThe application relies on computer vision to recognize the features of a user’s face and to then generate an accurate, high-fidelity, 3D model of that face, such that the eyewear fits properly.\r\n\r\nGlasses.com brought our engineers an excellent, fully-functioning version of the application, seeking acceleration. The app, however, took full advantage of the CPU, which would necessitate Glasses.com’s purchasing and managing a large amount of hardware. Further, the application was running at a slow thirty seconds per session, resulting in a sub-optimal user experience. Our engineers were tasked with parallelizing the process and reducing the session runtime.\r\n\r\nGlasses.com has several machines they are using in production. Their main setup consists of a Haswell/Ivy Bridge CPU paired with a GTX 690. The machine is able to run 4 processes concurrently. In the past, Glasses.com used a 32 core Intel process with a couple of K20X. They are still using these machines, but they are not the main configuration. They are also making use of the Amazon EC2 instances in case they exceed internal capacity.\r\n<blockquote>This app is amazing! It takes a 3D video of your face in just a few steps, and the rendering is spot on! RayBan Aviators are always a little big on me, and the app showed them on my face exactly as they fit in the store!\r\n<p style=\"text-align: right;\">--davidandrew, Apple Store</p>\r\n</blockquote>\r\nWe began by analyzing the application and targeting the process that would have the greatest impact on performance.\r\n\r\nThe most pressing concern was the rendering portion of code, which was running on the CPU. We implemented rendering in ArrayFire, which is specially optimized for CUDA GPUs. Further, we noticed that while the application was rendering-intensive, much of the rendering did not need to be precise—we could make estimations without compromising quality. This estimated rendering speedup operation was critical to the success of the project.\r\n\r\nWe discovered further opportunities for speedup within the architecture itself. The original app processed each frame in a separate thread; we accelerated this by combining each operation into a single kernel and running that kernel once. By moving the parallelization to the GPU we effectively took advantage of the strength of that architecture.\r\n\r\nUltimately, parallelizing the application and incorporating the ArrayFire software library accelerated the application to about ten seconds per session—roughly three times as fast as the original code, and twice as fast as the target speed. We further exceeded expectations by improving general stability when handling errors.\r\n\r\n<img class=\"aligncenter size-full wp-image-5468\" alt=\"glassesdotcom benchmarks\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/05/glassesdotcom-benchmarks.jpg\" width=\"700\" height=\"442\" />\r\n\r\nThe improvements in speed, stability, and user experience have resonated with the application’s target market, resulting in a 3.5/5 star rating in the Apple Store.','Case Study: Glasses.com App with 3Dfit Technology','','draft','open','closed','','','','','2014-05-01 17:28:25','2014-05-01 17:28:25','',0,'http://sandbox.arrayfire.com/?p=5464',0,'post','',0),(5465,7,'2014-05-01 17:04:28','2014-05-01 17:04:28','<blockquote>This app is amazing! It takes a 3D video of your face in just a few steps, and the rendering is spot on! RayBan Aviators are always a little big on me, and the app showed them on my face exactly as they fit in the store!</blockquote>\r\nAdopting a new look is tough! Haircut, clothing style, glasses—whatever the change may be, finding the right fit is stressful. Glasses.com set out to improve the experience by providing customers a way of virtually trying on glasses in the comfort of their homes via smart phone or tablet.\r\n\r\nThe Glasses.com app takes a picture of the user’s face, creates a 3D model of facial features, and virtually places selected frames on the user’s 3D image. The user is then free to view the 3D image from a wide variety of angles.\r\n\r\nThe application relies on computer vision to recognize the features of a user’s face and to then generate an accurate, high-fidelity, 3D model of that face, such that the eyewear fits properly.\r\n\r\nGlasses.com brought our engineers an excellent, fully-functioning version of the application, seeking acceleration. The app took full advantage of the CPU, which would necessitate Glasses.com’s purchasing and managing a large amount of hardware. Further, the application was running at a slow thirty seconds per session, resulting in a sub-optimal user experience. Our engineers were tasked with parallelizing the process and reducing the session runtime.\r\n\r\nGlasses.com has several machines they are using in production. Their main setup consists of a Haswell/Ivy Bridge CPU paired with a GTX 690. The machine is able to run 4 processes concurrently. In the past, Glasses.com used a 32 core Intel process with a couple of K20X. They are still using these machines, but they are not the main configuration. They are also making use of the Amazon EC2 instances in case they exceed internal capacity.\r\n\r\nWe began by analyzing the application and targeting the process which would have the greatest impact on performance.\r\n\r\nThe most pressing concern was the rendering portion of code, which was running on the CPU. We implemented rendering in ArrayFire, which is specially optimized for CUDA GPUs. Further, we noticed that while the application was rendering-intensive, much of the rendering did not need to be precise—we could make estimations without compromising quality. This estimated rendering speedup operation was critical to the success of the project.\r\n\r\nWe discovered further opportunities for speedup within the architecture itself. The original app processed each frame in a separate thread; we accelerated this by combining each operation into a single kernel and running that kernel once. By moving the parallelization to the GPU we effectively took advantage of the strength of that architecture.\r\n\r\nUltimately, parallelizing the application and incorporating the ArrayFire software library accelerated the application to about ten seconds per session—roughly three times as fast as the original code, and twice as fast as the target speed. We further exceeded expectations by improving general stability when handling errors.\r\n\r\nThe improvements in speed, stability, and user experience have resonated with the application’s target market, resulting in a 3.5/5 star rating in the Apple Store.','Case Study: Glasses.com App with 3Dfit Technology','','inherit','open','closed','','5464-revision-v1','','','2014-05-01 17:04:28','2014-05-01 17:04:28','',5464,'http://sandbox.arrayfire.com/5464-revision-v1/',0,'revision','',0),(5466,7,'2014-05-01 17:05:42','2014-05-01 17:05:42','<span style=\"line-height: 1.5em;\">Adopting a new look is tough! Haircut, clothing style, glasses—whatever the change may be, finding the right fit is stressful. Glasses.com set out to improve the experience by providing customers a way of virtually trying on glasses in the comfort of their homes via smart phone or tablet.</span>\r\n\r\nThe Glasses.com app takes a picture of the user’s face, creates a 3D model of facial features, and virtually places selected frames on the user’s 3D image. The user is then free to view the 3D image from a wide variety of angles.\r\n\r\nThe application relies on computer vision to recognize the features of a user’s face and to then generate an accurate, high-fidelity, 3D model of that face, such that the eyewear fits properly.\r\n\r\nGlasses.com brought our engineers an excellent, fully-functioning version of the application, seeking acceleration. The app took full advantage of the CPU, which would necessitate Glasses.com’s purchasing and managing a large amount of hardware. Further, the application was running at a slow thirty seconds per session, resulting in a sub-optimal user experience. Our engineers were tasked with parallelizing the process and reducing the session runtime.\r\n\r\nGlasses.com has several machines they are using in production. Their main setup consists of a Haswell/Ivy Bridge CPU paired with a GTX 690. The machine is able to run 4 processes concurrently. In the past, Glasses.com used a 32 core Intel process with a couple of K20X. They are still using these machines, but they are not the main configuration. They are also making use of the Amazon EC2 instances in case they exceed internal capacity.\r\n<blockquote>This app is amazing! It takes a 3D video of your face in just a few steps, and the rendering is spot on! RayBan Aviators are always a little big on me, and the app showed them on my face exactly as they fit in the store!</blockquote>\r\nWe began by analyzing the application and targeting the process that would have the greatest impact on performance.\r\n\r\nThe most pressing concern was the rendering portion of code, which was running on the CPU. We implemented rendering in ArrayFire, which is specially optimized for CUDA GPUs. Further, we noticed that while the application was rendering-intensive, much of the rendering did not need to be precise—we could make estimations without compromising quality. This estimated rendering speedup operation was critical to the success of the project.\r\n\r\nWe discovered further opportunities for speedup within the architecture itself. The original app processed each frame in a separate thread; we accelerated this by combining each operation into a single kernel and running that kernel once. By moving the parallelization to the GPU we effectively took advantage of the strength of that architecture.\r\n\r\nUltimately, parallelizing the application and incorporating the ArrayFire software library accelerated the application to about ten seconds per session—roughly three times as fast as the original code, and twice as fast as the target speed. We further exceeded expectations by improving general stability when handling errors.\r\n\r\nThe improvements in speed, stability, and user experience have resonated with the application’s target market, resulting in a 3.5/5 star rating in the Apple Store.','Case Study: Glasses.com App with 3Dfit Technology','','inherit','open','closed','','5464-revision-v1','','','2014-05-01 17:05:42','2014-05-01 17:05:42','',5464,'http://sandbox.arrayfire.com/5464-revision-v1/',0,'revision','',0),(5467,7,'2014-05-01 17:06:22','2014-05-01 17:06:22','<span style=\"line-height: 1.5em;\">Adopting a new look is tough! Haircut, clothing style, glasses—whatever the change may be, finding the right fit is stressful. Glasses.com set out to improve the experience by providing customers a way of virtually trying on glasses in the comfort of their homes via smart phone or tablet.</span>\r\n\r\nThe Glasses.com app takes a picture of the user’s face, creates a 3D model of facial features, and virtually places selected frames on the user’s 3D image. The user is then free to view the 3D image from a wide variety of angles.\r\n\r\nThe application relies on computer vision to recognize the features of a user’s face and to then generate an accurate, high-fidelity, 3D model of that face, such that the eyewear fits properly.\r\n\r\nGlasses.com brought our engineers an excellent, fully-functioning version of the application, seeking acceleration. The app took full advantage of the CPU, which would necessitate Glasses.com’s purchasing and managing a large amount of hardware. Further, the application was running at a slow thirty seconds per session, resulting in a sub-optimal user experience. Our engineers were tasked with parallelizing the process and reducing the session runtime.\r\n\r\nGlasses.com has several machines they are using in production. Their main setup consists of a Haswell/Ivy Bridge CPU paired with a GTX 690. The machine is able to run 4 processes concurrently. In the past, Glasses.com used a 32 core Intel process with a couple of K20X. They are still using these machines, but they are not the main configuration. They are also making use of the Amazon EC2 instances in case they exceed internal capacity.\r\n<blockquote>This app is amazing! It takes a 3D video of your face in just a few steps, and the rendering is spot on! RayBan Aviators are always a little big on me, and the app showed them on my face exactly as they fit in the store! --davidandrew, Apple Store</blockquote>\r\nWe began by analyzing the application and targeting the process that would have the greatest impact on performance.\r\n\r\nThe most pressing concern was the rendering portion of code, which was running on the CPU. We implemented rendering in ArrayFire, which is specially optimized for CUDA GPUs. Further, we noticed that while the application was rendering-intensive, much of the rendering did not need to be precise—we could make estimations without compromising quality. This estimated rendering speedup operation was critical to the success of the project.\r\n\r\nWe discovered further opportunities for speedup within the architecture itself. The original app processed each frame in a separate thread; we accelerated this by combining each operation into a single kernel and running that kernel once. By moving the parallelization to the GPU we effectively took advantage of the strength of that architecture.\r\n\r\nUltimately, parallelizing the application and incorporating the ArrayFire software library accelerated the application to about ten seconds per session—roughly three times as fast as the original code, and twice as fast as the target speed. We further exceeded expectations by improving general stability when handling errors.\r\n\r\nThe improvements in speed, stability, and user experience have resonated with the application’s target market, resulting in a 3.5/5 star rating in the Apple Store.','Case Study: Glasses.com App with 3Dfit Technology','','inherit','open','closed','','5464-revision-v1','','','2014-05-01 17:06:22','2014-05-01 17:06:22','',5464,'http://sandbox.arrayfire.com/5464-revision-v1/',0,'revision','',0),(5468,7,'2014-05-01 17:18:26','2014-05-01 17:18:26','','glassesdotcom benchmarks','','inherit','open','closed','','glassesdotcom-benchmarks','','','2014-05-01 17:18:26','2014-05-01 17:18:26','',5464,'http://sandbox.arrayfire.com/wp-content/uploads/2014/05/glassesdotcom-benchmarks.jpg',0,'attachment','image/jpeg',0),(5469,7,'2014-05-01 17:19:15','2014-05-01 17:19:15','<span style=\"line-height: 1.5em;\">Adopting a new look is tough! Haircut, clothing style, glasses—whatever the change may be, finding the right fit is stressful. Glasses.com set out to improve the experience by providing customers a way of virtually trying on glasses in the comfort of their homes via smart phone or tablet.</span>\r\n\r\nThe Glasses.com app takes a picture of the user’s face, creates a 3D model of facial features, and virtually places selected frames on the user’s 3D image. The user is then free to view the 3D image from a wide variety of angles.\r\n\r\nThe application relies on computer vision to recognize the features of a user’s face and to then generate an accurate, high-fidelity, 3D model of that face, such that the eyewear fits properly.\r\n\r\nGlasses.com brought our engineers an excellent, fully-functioning version of the application, seeking acceleration. The app took full advantage of the CPU, which would necessitate Glasses.com’s purchasing and managing a large amount of hardware. Further, the application was running at a slow thirty seconds per session, resulting in a sub-optimal user experience. Our engineers were tasked with parallelizing the process and reducing the session runtime.\r\n\r\nGlasses.com has several machines they are using in production. Their main setup consists of a Haswell/Ivy Bridge CPU paired with a GTX 690. The machine is able to run 4 processes concurrently. In the past, Glasses.com used a 32 core Intel process with a couple of K20X. They are still using these machines, but they are not the main configuration. They are also making use of the Amazon EC2 instances in case they exceed internal capacity.\r\n<blockquote>This app is amazing! It takes a 3D video of your face in just a few steps, and the rendering is spot on! RayBan Aviators are always a little big on me, and the app showed them on my face exactly as they fit in the store! --davidandrew, Apple Store</blockquote>\r\nWe began by analyzing the application and targeting the process that would have the greatest impact on performance.\r\n\r\nThe most pressing concern was the rendering portion of code, which was running on the CPU. We implemented rendering in ArrayFire, which is specially optimized for CUDA GPUs. Further, we noticed that while the application was rendering-intensive, much of the rendering did not need to be precise—we could make estimations without compromising quality. This estimated rendering speedup operation was critical to the success of the project.\r\n\r\nWe discovered further opportunities for speedup within the architecture itself. The original app processed each frame in a separate thread; we accelerated this by combining each operation into a single kernel and running that kernel once. By moving the parallelization to the GPU we effectively took advantage of the strength of that architecture.\r\n\r\nUltimately, parallelizing the application and incorporating the ArrayFire software library accelerated the application to about ten seconds per session—roughly three times as fast as the original code, and twice as fast as the target speed. We further exceeded expectations by improving general stability when handling errors.\r\n\r\n<img class=\"aligncenter size-full wp-image-5468\" alt=\"glassesdotcom benchmarks\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/05/glassesdotcom-benchmarks.jpg\" width=\"700\" height=\"442\" />\r\n\r\nThe improvements in speed, stability, and user experience have resonated with the application’s target market, resulting in a 3.5/5 star rating in the Apple Store.','Case Study: Glasses.com App with 3Dfit Technology','','inherit','open','closed','','5464-revision-v1','','','2014-05-01 17:19:15','2014-05-01 17:19:15','',5464,'http://sandbox.arrayfire.com/5464-revision-v1/',0,'revision','',0),(5470,7,'2014-05-01 17:22:37','2014-05-01 17:22:37','<span style=\"line-height: 1.5em;\">Adopting a new look is tough! Haircut, clothing style, glasses—whatever the change may be, finding the right fit is stressful. Glasses.com set out to improve the experience by providing customers a way of virtually trying on glasses in the comfort of their homes via smart phone or tablet.</span>\r\n\r\nThe Glasses.com app takes a picture of the user’s face, creates a 3D model of facial features, and virtually places selected frames on the user’s 3D image. The user is then free to view the 3D image from a wide variety of angles.\r\n\r\nThe application relies on computer vision to recognize the features of a user’s face and to then generate an accurate, high-fidelity, 3D model of that face, such that the eyewear fits properly.\r\n\r\nGlasses.com brought our engineers an excellent, fully-functioning version of the application, seeking acceleration. The app took full advantage of the CPU, which would necessitate Glasses.com’s purchasing and managing a large amount of hardware. Further, the application was running at a slow thirty seconds per session, resulting in a sub-optimal user experience. Our engineers were tasked with parallelizing the process and reducing the session runtime.\r\n\r\nGlasses.com has several machines they are using in production. Their main setup consists of a Haswell/Ivy Bridge CPU paired with a GTX 690. The machine is able to run 4 processes concurrently. In the past, Glasses.com used a 32 core Intel process with a couple of K20X. They are still using these machines, but they are not the main configuration. They are also making use of the Amazon EC2 instances in case they exceed internal capacity.\r\n<blockquote>This app is amazing! It takes a 3D video of your face in just a few steps, and the rendering is spot on! RayBan Aviators are always a little big on me, and the app showed them on my face exactly as they fit in the store!\r\n--davidandrew, Apple Store</blockquote>\r\nWe began by analyzing the application and targeting the process that would have the greatest impact on performance.\r\n\r\nThe most pressing concern was the rendering portion of code, which was running on the CPU. We implemented rendering in ArrayFire, which is specially optimized for CUDA GPUs. Further, we noticed that while the application was rendering-intensive, much of the rendering did not need to be precise—we could make estimations without compromising quality. This estimated rendering speedup operation was critical to the success of the project.\r\n\r\nWe discovered further opportunities for speedup within the architecture itself. The original app processed each frame in a separate thread; we accelerated this by combining each operation into a single kernel and running that kernel once. By moving the parallelization to the GPU we effectively took advantage of the strength of that architecture.\r\n\r\nUltimately, parallelizing the application and incorporating the ArrayFire software library accelerated the application to about ten seconds per session—roughly three times as fast as the original code, and twice as fast as the target speed. We further exceeded expectations by improving general stability when handling errors.\r\n\r\n<img class=\"aligncenter size-full wp-image-5468\" alt=\"glassesdotcom benchmarks\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/05/glassesdotcom-benchmarks.jpg\" width=\"700\" height=\"442\" />\r\n\r\nThe improvements in speed, stability, and user experience have resonated with the application’s target market, resulting in a 3.5/5 star rating in the Apple Store.','Case Study: Glasses.com App with 3Dfit Technology','','inherit','open','closed','','5464-revision-v1','','','2014-05-01 17:22:37','2014-05-01 17:22:37','',5464,'http://sandbox.arrayfire.com/5464-revision-v1/',0,'revision','',0),(5471,7,'2014-05-01 17:23:33','2014-05-01 17:23:33','<span style=\"line-height: 1.5em;\">Adopting a new look is tough! Haircut, clothing style, glasses—whatever the change may be, finding the right fit is stressful. Glasses.com set out to improve the experience by providing customers a way of virtually trying on glasses in the comfort of their homes via smart phone or tablet.</span>\r\n\r\nThe Glasses.com app takes a picture of the user’s face, creates a 3D model of facial features, and virtually places selected frames on the user’s 3D image. The user is then free to view the 3D image from a wide variety of angles.\r\n\r\nThe application relies on computer vision to recognize the features of a user’s face and to then generate an accurate, high-fidelity, 3D model of that face, such that the eyewear fits properly.\r\n\r\nGlasses.com brought our engineers an excellent, fully-functioning version of the application, seeking acceleration. The app took full advantage of the CPU, which would necessitate Glasses.com’s purchasing and managing a large amount of hardware. Further, the application was running at a slow thirty seconds per session, resulting in a sub-optimal user experience. Our engineers were tasked with parallelizing the process and reducing the session runtime.\r\n\r\nGlasses.com has several machines they are using in production. Their main setup consists of a Haswell/Ivy Bridge CPU paired with a GTX 690. The machine is able to run 4 processes concurrently. In the past, Glasses.com used a 32 core Intel process with a couple of K20X. They are still using these machines, but they are not the main configuration. They are also making use of the Amazon EC2 instances in case they exceed internal capacity.\r\n<blockquote>This app is amazing! It takes a 3D video of your face in just a few steps, and the rendering is spot on! RayBan Aviators are always a little big on me, and the app showed them on my face exactly as they fit in the store!\r\n<p style=\"text-align: right;\">--davidandrew, Apple Store</p>\r\n</blockquote>\r\nWe began by analyzing the application and targeting the process that would have the greatest impact on performance.\r\n\r\nThe most pressing concern was the rendering portion of code, which was running on the CPU. We implemented rendering in ArrayFire, which is specially optimized for CUDA GPUs. Further, we noticed that while the application was rendering-intensive, much of the rendering did not need to be precise—we could make estimations without compromising quality. This estimated rendering speedup operation was critical to the success of the project.\r\n\r\nWe discovered further opportunities for speedup within the architecture itself. The original app processed each frame in a separate thread; we accelerated this by combining each operation into a single kernel and running that kernel once. By moving the parallelization to the GPU we effectively took advantage of the strength of that architecture.\r\n\r\nUltimately, parallelizing the application and incorporating the ArrayFire software library accelerated the application to about ten seconds per session—roughly three times as fast as the original code, and twice as fast as the target speed. We further exceeded expectations by improving general stability when handling errors.\r\n\r\n<img class=\"aligncenter size-full wp-image-5468\" alt=\"glassesdotcom benchmarks\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/05/glassesdotcom-benchmarks.jpg\" width=\"700\" height=\"442\" />\r\n\r\nThe improvements in speed, stability, and user experience have resonated with the application’s target market, resulting in a 3.5/5 star rating in the Apple Store.','Case Study: Glasses.com App with 3Dfit Technology','','inherit','open','closed','','5464-revision-v1','','','2014-05-01 17:23:33','2014-05-01 17:23:33','',5464,'http://sandbox.arrayfire.com/5464-revision-v1/',0,'revision','',0),(5472,7,'2014-05-01 17:28:25','2014-05-01 17:28:25','<span style=\"line-height: 1.5em;\">Adopting a new look is tough! Haircut, clothing style, glasses—whatever the change may be, finding the right fit is stressful. Glasses.com set out to improve the experience by providing customers a way of virtually trying on glasses in the comfort of their homes via smart phone or tablet.</span>\r\n\r\nThe Glasses.com app takes a picture of the user’s face, creates a 3D model of facial features, and virtually places selected frames on the user’s 3D image. The user is then free to view the 3D image from a wide variety of angles.\r\n\r\nThe application relies on computer vision to recognize the features of a user’s face and to then generate an accurate, high-fidelity, 3D model of that face, such that the eyewear fits properly.\r\n\r\nGlasses.com brought our engineers an excellent, fully-functioning version of the application, seeking acceleration. The app, however, took full advantage of the CPU, which would necessitate Glasses.com’s purchasing and managing a large amount of hardware. Further, the application was running at a slow thirty seconds per session, resulting in a sub-optimal user experience. Our engineers were tasked with parallelizing the process and reducing the session runtime.\r\n\r\nGlasses.com has several machines they are using in production. Their main setup consists of a Haswell/Ivy Bridge CPU paired with a GTX 690. The machine is able to run 4 processes concurrently. In the past, Glasses.com used a 32 core Intel process with a couple of K20X. They are still using these machines, but they are not the main configuration. They are also making use of the Amazon EC2 instances in case they exceed internal capacity.\r\n<blockquote>This app is amazing! It takes a 3D video of your face in just a few steps, and the rendering is spot on! RayBan Aviators are always a little big on me, and the app showed them on my face exactly as they fit in the store!\r\n<p style=\"text-align: right;\">--davidandrew, Apple Store</p>\r\n</blockquote>\r\nWe began by analyzing the application and targeting the process that would have the greatest impact on performance.\r\n\r\nThe most pressing concern was the rendering portion of code, which was running on the CPU. We implemented rendering in ArrayFire, which is specially optimized for CUDA GPUs. Further, we noticed that while the application was rendering-intensive, much of the rendering did not need to be precise—we could make estimations without compromising quality. This estimated rendering speedup operation was critical to the success of the project.\r\n\r\nWe discovered further opportunities for speedup within the architecture itself. The original app processed each frame in a separate thread; we accelerated this by combining each operation into a single kernel and running that kernel once. By moving the parallelization to the GPU we effectively took advantage of the strength of that architecture.\r\n\r\nUltimately, parallelizing the application and incorporating the ArrayFire software library accelerated the application to about ten seconds per session—roughly three times as fast as the original code, and twice as fast as the target speed. We further exceeded expectations by improving general stability when handling errors.\r\n\r\n<img class=\"aligncenter size-full wp-image-5468\" alt=\"glassesdotcom benchmarks\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/05/glassesdotcom-benchmarks.jpg\" width=\"700\" height=\"442\" />\r\n\r\nThe improvements in speed, stability, and user experience have resonated with the application’s target market, resulting in a 3.5/5 star rating in the Apple Store.','Case Study: Glasses.com App with 3Dfit Technology','','inherit','open','closed','','5464-revision-v1','','','2014-05-01 17:28:25','2014-05-01 17:28:25','',5464,'http://sandbox.arrayfire.com/5464-revision-v1/',0,'revision','',0),(5476,7,'2014-05-01 21:10:25','2014-05-01 21:10:25','','Splash','','inherit','open','closed','','splash','','','2014-05-01 21:10:25','2014-05-01 21:10:25','',0,'http://sandbox.arrayfire.com/wp-content/uploads/2014/05/Splash.png',0,'attachment','image/png',0),(5485,7,'2014-05-05 18:55:02','2014-05-05 18:55:02','We have officially rebranded from AccelerEyes to ArrayFire!\r\n<div class=\"wistia_embed\" id=\"wistia_rj2bar3xxp\" style=\"width: 640px; height: 388px;\"></div>\r\n<script charset=\"ISO-8859-1\" type=\"text/javascript\" src=\"//fast.wistia.com/assets/external/E-v1.js\"></script><script type=\"text/javascript\">// <![CDATA[\r\nwistiaEmbed = Wistia.embed(\"rj2bar3xxp\");\r\n// ]]></script>Our rebranding includes a <a href=\"http://arrayfire.com\">website redesign</a>, improved <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a>, and–bonus–an upcoming release of a new version of the <a href=\"http://www.sandbox.arrayfire.com/docs/group__arrayfire__func.htm\">ArrayFire software library</a>. We have even more innovations waiting in the wings, and we are optimistic of a bright future under our new banner!\r\n\r\nPlease don’t hesitate to <a href=\"http://sandbox.arrayfire.com/company/#contact\">contact us</a> if you have any questions about this transition–we’re happy to help you find what you’re looking for and to assist in whatever ways we can.\r\n\r\n<span style=\"line-height: 1.5em;\">If you want faster code, </span>you\'ve<span style=\"line-height: 1.5em;\"> come to the right place!</span>\r\n\r\n-The <a href=\"http://sandbox.arrayfire.com/#services\">ArrayFire Gang</a>','New Look, Same Acceleration Gang','','publish','open','closed','','new-look-same-acceleration-gang','','','2014-05-05 18:55:02','2014-05-05 18:55:02','',0,'http://sandbox.arrayfire.com/?p=5485',0,'post','',0),(5486,7,'2014-05-02 17:18:59','2014-05-02 17:18:59','We have officially rebranded from AccelerEyes to ArrayFire!\r\n\r\n<div id=\"wistia_rj2bar3xxp\" class=\"wistia_embed\" style=\"width:640px;height:388px;\"> </div>\r\n<script charset=\"ISO-8859-1\" src=\"//fast.wistia.com/assets/external/E-v1.js\"></script>\r\n<script>\r\nwistiaEmbed = Wistia.embed(\"rj2bar3xxp\");\r\n</script>\r\n\r\nOur rebranding includes a website facelift, the introduction of our ArrayFire gang characters, and–bonus!–an upcoming release of a new version of our software library. We’ve got innovations waiting in the wings, and are optimistic of a bright future under our new banner.\r\n\r\nPlease don’t be afraid to contact us if you encounter any difficulties as a result of this transition–we’re happy to help you find what you’re looking for or to assist in whatever ways we can. If you want faster code, you’ve come to the right place.','Rebrand','','inherit','open','closed','','5485-revision-v1','','','2014-05-02 17:18:59','2014-05-02 17:18:59','',5485,'http://sandbox.arrayfire.com/5485-revision-v1/',0,'revision','',0),(5487,7,'2014-05-02 17:19:42','2014-05-02 17:19:42','We have officially rebranded from AccelerEyes to ArrayFire!\r\n<div class=\"wistia_embed\" id=\"wistia_rj2bar3xxp\" style=\"width: 640px; height: 388px;\"></div>\r\n<script charset=\"ISO-8859-1\" type=\"text/javascript\" src=\"//fast.wistia.com/assets/external/E-v1.js\"></script><script type=\"text/javascript\">// <![CDATA[\r\nwistiaEmbed = Wistia.embed(\"rj2bar3xxp\");\r\n// ]]></script>\r\nOur rebranding includes a website facelift, the introduction of our ArrayFire gang characters, and–bonus!–an upcoming release of a new version of our software library. We’ve got innovations waiting in the wings, and are optimistic of a bright future under our new banner.\r\n\r\nPlease don’t be afraid to contact us if you encounter any difficulties as a result of this transition–we’re happy to help you find what you’re looking for or to assist in whatever ways we can. If you want faster code, you’ve come to the right place.','Rebrand','','inherit','open','closed','','5485-revision-v1','','','2014-05-02 17:19:42','2014-05-02 17:19:42','',5485,'http://sandbox.arrayfire.com/5485-revision-v1/',0,'revision','',0),(5488,7,'2014-05-02 17:19:54','2014-05-02 17:19:54','We have officially rebranded from AccelerEyes to ArrayFire!\r\n<div class=\"wistia_embed\" id=\"wistia_rj2bar3xxp\" style=\"width: 640px; height: 388px;\"></div>\r\n<script charset=\"ISO-8859-1\" type=\"text/javascript\" src=\"//fast.wistia.com/assets/external/E-v1.js\"></script><script type=\"text/javascript\">// <![CDATA[\r\nwistiaEmbed = Wistia.embed(\"rj2bar3xxp\");\r\n// ]]></script>Our rebranding includes a website facelift, the introduction of our ArrayFire gang characters, and–bonus!–an upcoming release of a new version of our software library. We’ve got innovations waiting in the wings, and are optimistic of a bright future under our new banner.\r\n\r\nPlease don’t be afraid to contact us if you encounter any difficulties as a result of this transition–we’re happy to help you find what you’re looking for or to assist in whatever ways we can. If you want faster code, you’ve come to the right place.','Rebrand','','inherit','open','closed','','5485-revision-v1','','','2014-05-02 17:19:54','2014-05-02 17:19:54','',5485,'http://sandbox.arrayfire.com/5485-revision-v1/',0,'revision','',0),(5489,7,'2014-05-02 17:23:31','2014-05-02 17:23:31','We have officially rebranded from AccelerEyes to ArrayFire!\r\n<div class=\"wistia_embed\" id=\"wistia_rj2bar3xxp\" style=\"width: 640px; height: 388px;\"></div>\r\n<script charset=\"ISO-8859-1\" type=\"text/javascript\" src=\"//fast.wistia.com/assets/external/E-v1.js\"></script><script type=\"text/javascript\">// <![CDATA[\r\nwistiaEmbed = Wistia.embed(\"rj2bar3xxp\");\r\n// ]]></script>Our rebranding includes a website redesign, improved <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a>, the introduction of our ArrayFire gang characters, and–bonus!–an upcoming release of a new version of our software library. We’ve got innovations waiting in the wings, and are optimistic of a bright future under our new banner.\r\n\r\nPlease don’t be afraid to contact us if you encounter any difficulties as a result of this transition–we’re happy to help you find what you’re looking for or to assist in whatever ways we can. If you want faster code, you’ve come to the right place.','Rebrand','','inherit','open','closed','','5485-revision-v1','','','2014-05-02 17:23:31','2014-05-02 17:23:31','',5485,'http://sandbox.arrayfire.com/5485-revision-v1/',0,'revision','',0),(5491,6,'2014-05-05 18:53:37','2014-05-05 18:53:37','We have officially rebranded from AccelerEyes to ArrayFire!\r\n<div class=\"wistia_embed\" id=\"wistia_rj2bar3xxp\" style=\"width: 640px; height: 388px;\"></div>\r\n<script charset=\"ISO-8859-1\" type=\"text/javascript\" src=\"//fast.wistia.com/assets/external/E-v1.js\"></script><script type=\"text/javascript\">// <![CDATA[\r\nwistiaEmbed = Wistia.embed(\"rj2bar3xxp\");\r\n// ]]></script>Our rebranding includes a <a href=\"http://arrayfire.com\">website redesign</a>, improved <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a>, and–bonus–an upcoming release of a new version of the <a href=\"http://www.sandbox.arrayfire.com/docs/group__arrayfire__func.htm\">ArrayFire software library</a>. We have even more innovations waiting in the wings, and we are optimistic of a bright future under our new banner!\r\n\r\nPlease don’t hesitate to <a href=\"http://sandbox.arrayfire.com/company/#contact\">contact us</a> if you have any questions about this transition–we’re happy to help you find what you’re looking for and to assist in whatever ways we can.\r\n\r\n<span style=\"line-height: 1.5em;\">If you want faster code, </span>you\'ve<span style=\"line-height: 1.5em;\"> come to the right place!</span>\r\n\r\n-The <a href=\"http://sandbox.arrayfire.com/#services\">ArrayFire Gang</a>','New Look, Same Acceleration Gang','','inherit','open','closed','','5485-autosave-v1','','','2014-05-05 18:53:37','2014-05-05 18:53:37','',5485,'http://sandbox.arrayfire.com/5485-autosave-v1/',0,'revision','',0),(5492,6,'2014-05-05 18:30:16','2014-05-05 18:30:16','We have officially rebranded from AccelerEyes to ArrayFire!\r\n<div class=\"wistia_embed\" id=\"wistia_rj2bar3xxp\" style=\"width: 640px; height: 388px;\"></div>\r\n<script charset=\"ISO-8859-1\" type=\"text/javascript\" src=\"//fast.wistia.com/assets/external/E-v1.js\"></script><script type=\"text/javascript\">// <![CDATA[\r\nwistiaEmbed = Wistia.embed(\"rj2bar3xxp\");\r\n// ]]></script>Our rebranding includes a website redesign, improved <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a>, the introduction of our ArrayFire gang characters, and–bonus!–an upcoming release of a new version of the ArrayFire software library. We have even more innovations waiting in the wings, and are optimistic of a bright future under our new banner.\r\n\r\nPlease don’t hesitate to contact us if you questions about this transition–we’re happy to help you find what you’re looking for or to assist in whatever ways we can.\r\n\r\n<span style=\"line-height: 1.5em;\">If you want faster code, </span>you\'ve<span style=\"line-height: 1.5em;\"> come to the right place!</span>\r\n\r\n-The ArrayFire Gang','New Look, Same Acceleration Gang','','inherit','open','closed','','5485-revision-v1','','','2014-05-05 18:30:16','2014-05-05 18:30:16','',5485,'http://sandbox.arrayfire.com/5485-revision-v1/',0,'revision','',0),(5493,6,'2014-05-05 18:32:52','2014-05-05 18:32:52','We have officially rebranded from AccelerEyes to ArrayFire!\r\n<div class=\"wistia_embed\" id=\"wistia_rj2bar3xxp\" style=\"width: 640px; height: 388px;\"></div>\r\n<script charset=\"ISO-8859-1\" type=\"text/javascript\" src=\"//fast.wistia.com/assets/external/E-v1.js\"></script><script type=\"text/javascript\">// <![CDATA[\r\nwistiaEmbed = Wistia.embed(\"rj2bar3xxp\");\r\n// ]]></script>Our rebranding includes a website redesign, improved <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a>, the introduction of our ArrayFire gang characters, and–bonus!–an upcoming release of a new version of the ArrayFire software library. We have even more innovations waiting in the wings, and we are optimistic of a bright future under our new banner.\r\n\r\nPlease don’t hesitate to contact us if you questions about this transition–we’re happy to help you find what you’re looking for or to assist in whatever ways we can.\r\n\r\n<span style=\"line-height: 1.5em;\">If you want faster code, </span>you\'ve<span style=\"line-height: 1.5em;\"> come to the right place!</span>\r\n\r\n-The ArrayFire Gang','New Look, Same Acceleration Gang','','inherit','open','closed','','5485-revision-v1','','','2014-05-05 18:32:52','2014-05-05 18:32:52','',5485,'http://sandbox.arrayfire.com/5485-revision-v1/',0,'revision','',0),(5494,6,'2014-05-05 18:45:03','2014-05-05 18:45:03','We have officially rebranded from AccelerEyes to ArrayFire!\r\n<div class=\"wistia_embed\" id=\"wistia_rj2bar3xxp\" style=\"width: 640px; height: 388px;\"></div>\r\n<script charset=\"ISO-8859-1\" type=\"text/javascript\" src=\"//fast.wistia.com/assets/external/E-v1.js\"></script><script type=\"text/javascript\">// <![CDATA[\r\nwistiaEmbed = Wistia.embed(\"rj2bar3xxp\");\r\n// ]]></script>Our rebranding includes a <a href=\"http://arrayfire.com\">website redesign</a>, improved <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a>, and–bonus–an upcoming release of a new version of the ArrayFire software library. We have even more innovations waiting in the wings, and we are optimistic of a bright future under our new banner!\r\n\r\nPlease don’t hesitate to <a href=\"http://sandbox.arrayfire.com/company/#contact\">contact us</a> if you have any questions about this transition–we’re happy to help you find what you’re looking for or to assist in whatever ways we can.\r\n\r\n<span style=\"line-height: 1.5em;\">If you want faster code, </span>you\'ve<span style=\"line-height: 1.5em;\"> come to the right place!</span>\r\n\r\n-The <a href=\"http://sandbox.arrayfire.com/#services\">ArrayFire Gang</a>','New Look, Same Acceleration Gang','','inherit','open','closed','','5485-revision-v1','','','2014-05-05 18:45:03','2014-05-05 18:45:03','',5485,'http://sandbox.arrayfire.com/5485-revision-v1/',0,'revision','',0),(5495,6,'2014-05-05 18:46:37','2014-05-05 18:46:37','We have officially rebranded from AccelerEyes to ArrayFire!\r\n<div class=\"wistia_embed\" id=\"wistia_rj2bar3xxp\" style=\"width: 640px; height: 388px;\"></div>\r\n<script charset=\"ISO-8859-1\" type=\"text/javascript\" src=\"//fast.wistia.com/assets/external/E-v1.js\"></script><script type=\"text/javascript\">// <![CDATA[\r\nwistiaEmbed = Wistia.embed(\"rj2bar3xxp\");\r\n// ]]></script>Our rebranding includes a <a href=\"http://arrayfire.com\">website redesign</a>, improved <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a>, and–bonus–an upcoming release of a new version of the ArrayFire software library. We have even more innovations waiting in the wings, and we are optimistic of a bright future under our new banner!\r\n\r\nPlease don’t hesitate to <a href=\"http://sandbox.arrayfire.com/company/#contact\">contact us</a> if you have any questions about this transition–we’re happy to help you find what you’re looking for and to assist in whatever ways we can.\r\n\r\n<span style=\"line-height: 1.5em;\">If you want faster code, </span>you\'ve<span style=\"line-height: 1.5em;\"> come to the right place!</span>\r\n\r\n-The <a href=\"http://sandbox.arrayfire.com/#services\">ArrayFire Gang</a>','New Look, Same Acceleration Gang','','inherit','open','closed','','5485-revision-v1','','','2014-05-05 18:46:37','2014-05-05 18:46:37','',5485,'http://sandbox.arrayfire.com/5485-revision-v1/',0,'revision','',0),(5496,6,'2014-05-05 18:50:36','2014-05-05 18:50:36','We have officially rebranded from AccelerEyes to ArrayFire!\r\n<div class=\"wistia_embed\" id=\"wistia_rj2bar3xxp\" style=\"width: 640px; height: 388px;\"></div>\r\n<script charset=\"ISO-8859-1\" type=\"text/javascript\" src=\"//fast.wistia.com/assets/external/E-v1.js\"></script><script type=\"text/javascript\">// <![CDATA[\r\nwistiaEmbed = Wistia.embed(\"rj2bar3xxp\");\r\n// ]]></script>Our rebranding includes a <a href=\"http://arrayfire.com\">website redesign</a>, improved <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a>, and–bonus–an upcoming release of a new version of the <a href=\"http://www.sandbox.arrayfire.com/docs/group__arrayfire__func.htm\">ArrayFire software library</a>. We have even more innovations waiting in the wings, and we are optimistic of a bright future under our new banner!\r\n\r\nPlease don’t hesitate to <a href=\"http://sandbox.arrayfire.com/company/#contact\">contact us</a> if you have any questions about this transition–we’re happy to help you find what you’re looking for and to assist in whatever ways we can.\r\n\r\n<span style=\"line-height: 1.5em;\">If you want faster code, </span>you\'ve<span style=\"line-height: 1.5em;\"> come to the right place!</span>\r\n\r\n-The <a href=\"http://sandbox.arrayfire.com/#services\">ArrayFire Gang</a>','New Look, Same Acceleration Gang','','inherit','open','closed','','5485-revision-v1','','','2014-05-05 18:50:36','2014-05-05 18:50:36','',5485,'http://sandbox.arrayfire.com/5485-revision-v1/',0,'revision','',0),(5497,7,'2014-05-06 16:21:24','2014-05-06 16:21:24','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire examples as well as the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nBe sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\n</div>\r\n<div>\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 16:21:24','2014-05-06 16:21:24','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5498,7,'2014-05-06 16:22:11','2014-05-06 16:22:11','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire examples as well as the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nBe sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 16:22:11','2014-05-06 16:22:11','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5499,7,'2014-05-06 16:24:45','2014-05-06 16:24:45','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 16:24:45','2014-05-06 16:24:45','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5500,7,'2014-05-06 19:22:47','2014-05-06 19:22:47','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 19:22:47','2014-05-06 19:22:47','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5501,7,'2014-05-06 19:23:29','2014-05-06 19:23:29','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] All language wrappers\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 19:23:29','2014-05-06 19:23:29','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0);
INSERT INTO `wp_posts` VALUES (5502,7,'2014-05-06 19:23:42','2014-05-06 19:23:42','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] All language wrappers\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 19:23:42','2014-05-06 19:23:42','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5503,7,'2014-05-06 19:25:53','2014-05-06 19:25:53','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <strong>ArrayFire v2.1</strong>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] All language wrappers\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] translate an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] scale an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] transform_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] rotate_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 19:25:53','2014-05-06 19:25:53','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5504,7,'2014-05-06 19:30:15','2014-05-06 19:30:15','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <a href=\"http://www.sandbox.arrayfire.com/docs/installation.htm\"><strong>ArrayFire v2.1</strong></a>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 19:30:15','2014-05-06 19:30:15','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5505,7,'2014-05-06 19:36:19','2014-05-06 19:36:19','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <a href=\"http://www.sandbox.arrayfire.com/docs/installation.htm\"><strong>ArrayFire v2.1</strong></a>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n<p style=\"padding-left: 30px;\">[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a></p>\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 19:36:19','2014-05-06 19:36:19','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5506,7,'2014-05-06 19:37:36','2014-05-06 19:37:36','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <a href=\"http://www.sandbox.arrayfire.com/docs/installation.htm\"><strong>ArrayFire v2.1</strong></a>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 19:37:36','2014-05-06 19:37:36','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5507,7,'2014-05-06 19:39:29','2014-05-06 19:39:29','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <a href=\"http://www.sandbox.arrayfire.com/docs/installation.htm\"><strong>ArrayFire v2.1</strong></a>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] All language wrappers\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] translate an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] scale an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] transform_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] rotate_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 19:39:29','2014-05-06 19:39:29','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5508,7,'2014-05-06 19:40:35','2014-05-06 19:40:35','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <a href=\"http://www.sandbox.arrayfire.com/docs/installation.htm\"><strong>ArrayFire v2.1</strong></a>\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] All language wrappers\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] translate an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] scale an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] transform_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] rotate_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 19:40:35','2014-05-06 19:40:35','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5509,7,'2014-05-06 19:40:57','2014-05-06 19:40:57','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <a href=\"http://www.sandbox.arrayfire.com/docs/installation.htm\">ArrayFire v2.1</a>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] All language wrappers\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] translate an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] scale an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] transform_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] rotate_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 19:40:57','2014-05-06 19:40:57','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5510,7,'2014-05-06 19:41:24','2014-05-06 19:41:24','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <a href=\"http://www.sandbox.arrayfire.com/docs/installation.htm\"><strong>ArrayFire v2.1</strong></a>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] All language wrappers\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] translate an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] scale an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] transform_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] rotate_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-06 19:41:24','2014-05-06 19:41:24','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5511,6,'2014-05-07 14:17:10','2014-05-07 14:17:10','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <a href=\"http://www.sandbox.arrayfire.com/docs/installation.htm\"><strong>ArrayFire v2.1</strong></a>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-autosave-v1','','','2014-05-07 14:17:10','2014-05-07 14:17:10','',5341,'http://sandbox.arrayfire.com/5341-autosave-v1/',0,'revision','',0),(5512,6,'2014-05-07 14:22:07','2014-05-07 14:22:07','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <a href=\"http://www.sandbox.arrayfire.com/docs/installation.htm\"><strong>ArrayFire v2.1</strong></a>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n[icon type=\"caret-right\"] All language wrappers\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n[icon type=\"angle-right\"] translate an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n[icon type=\"angle-right\"] scale an image using affine transforms\r\n[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n[icon type=\"caret-right\"] transform_coords()\r\n[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n[icon type=\"caret-right\"] rotate_coords()\r\n[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-07 14:22:07','2014-05-07 14:22:07','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5513,7,'2014-05-07 14:32:10','2014-05-07 14:32:10','<a href=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd.png\"><img class=\"aligncenter size-medium wp-image-242\" alt=\"arrayfire_logo_whitebkgnd\" src=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/01/arrayfire_logo_whitebkgnd-300x42.png\" width=\"300\" height=\"42\" /></a>\r\n\r\nIt\'s that time again—we\'re pleased to announce the release of our newest version of ArrayFire: <a href=\"http://www.sandbox.arrayfire.com/docs/installation.htm\"><strong>ArrayFire v2.1</strong></a>.\r\n\r\nArrayFire v2.1 is now bigger, faster, and stronger, thanks to some key function additions, API changes, feature improvements, and bug fixes.\r\n\r\nArrayFire is a CUDA and OpenCL library designed for maximum speed without the hassle of writing time-consuming CUDA and OpenCL device code.  With ArrayFire’s library functions, developers can maximize productivity and performance. Each of ArrayFire’s functions has been hand-tuned by CUDA and OpenCL experts.\r\n<h3>Major Updates</h3>\r\n[icon type=\"angle-double-right\"] Support for CUDA 6.0\r\n[icon type=\"angle-double-right\"] Support for Mac OS X\r\n[icon type=\"angle-double-right\"] New language support (<a href=\"https://github.com/arrayfire\">available on github</a>)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_java\">ArrayFire for Java</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_r\">ArrayFire for R!</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_fortran\">ArrayFire for Fortran</a>*\r\n[icon type=\"angle-double-right\"] <a href=\"https://github.com/arrayfire\">ArrayFire Extras on Github</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] All language wrappers\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_examples\">Rolling updates to examples</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">OpenGL interop example</a>\r\n\r\n<em>*ArrayFire for Fortan has been removed from the installed library, but can be downloaded from the ArrayFire Extras GitHub page linked above.</em>\r\n<h3>Function Additions</h3>\r\n[icon type=\"angle-double-right\"] Image transformation (warp affine) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__transform.htm#ga886e586ee8e8c259202c06bd134d828a\">transform()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] affine and inverse affine transform of an image\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__translate.htm#ga1615c8ea000ad113a0dc7a9313d7b645\">translate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] translate an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__scale.htm#ga288ebb8f3c3fb1c3a96260db4cc3b0cc\">scale()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] scale an image using affine transforms\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__skew.htm#gaacc7eb5f757a28d2e7d762f6b489fd5b\">skew()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] skew an image using affine transforms\r\n[icon type=\"angle-double-right\"] Coordinate transformation (homogeneous transformation) functions\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] transform_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] Up to 3D homogeneous transformations\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] rotate_coords()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"angle-right\"] rotation matrix wrapper for homogeneous coordinate transformation\r\n<h3>API Changes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] Added optional 4th parameter `recenter`\r\n[icon type=\"angle-double-right\"] af_filter removed\r\n<h3>Feature Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a> and <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#ga33ead0c86faace1072a227cd82a19bc1\">approx2()</a> now support nearest interpolation\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>, <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__convolve.htm#ga7a76750edf6c2d200ce8adf0740574c5\">convolve()</a> work for stack of images(3D) and gfor\r\n[icon type=\"angle-double-right\"] new indexing functions to add support for 4-th dimension gfor\r\n[icon type=\"angle-double-right\"] host pinned memory support for OpenCL\r\n<h3>Bug Fixes</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__loadimage.htm#gacd12e91d2760fe62fc6b781ae39d30be\">loadimage()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed bug with grayscale image reading\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__gaussiankernel.htm#gad77314eb6df8aae428d52898b5b6a78e\">gaussiankernel()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed computation of gaussian kernel values\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__resize.htm#ga68a694d57cbb95ca74b6f9763fd6500b\">resize()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed resize in OpenCL\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__medfilt.htm#ga4bf90c566ac99adb38d679a5a598b65f\">medfilt()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed to handle more data types\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a>\r\n[icon type=\"caret-right\"] fixed rounding issue on Tahiti GPUs\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__signal__func__cpp__approx.htm#gadf7bb6bdd0fb3c9008096d47c349d073\">approx1()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed for gfor use\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__array__func__cpp__flip.htm#ga920af856ce0c993a929850149a289d60\">flip()</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[icon type=\"caret-right\"] fixed launch configuration\r\n[icon type=\"angle-double-right\"] indexing now works on intel GPUs\r\n<h3>Performance Improvements</h3>\r\n[icon type=\"angle-double-right\"] <a href=\"http://www.sandbox.arrayfire.com/docs/group__image__func__cpp__rotate.htm#ga4e7771d3b41adcb8223aa043e2e31b98\">rotate()</a> rewritten to improve performance\r\n\r\n<span style=\"line-height: 1.5em;\">Visit our sleek, new <a href=\"http://www.sandbox.arrayfire.com/docs/\">documentation</a> to see ArrayFire in action and to view the complete list of all the enhancements available with ArrayFire v2.1.</span>\r\n\r\nWhile you\'re at it, be sure to check out our <a href=\"http://sandbox.arrayfire.com/#licensing\">ArrayFire licensing information</a>  to learn more about which licensing option would be the best for your needs.\r\n<div>\r\n\r\nJust getting started with GPU computing? Need an extra hand on a project? Tap into our deep parallel computing expertise and vast code base by setting up a free <a href=\"http://www.meetme.so/arrayfire\">technical consultation</a> today.\r\n\r\nWe’re always looking to make ArrayFire even better—let us know your thoughts through this short <a href=\"https://www.surveymonkey.com/s/arrayfire-new-feature\">survey</a>. We promise it’ll be worth your while!\r\n\r\n</div>','ArrayFire v2.1 Official Release','','inherit','open','closed','','5341-revision-v1','','','2014-05-07 14:32:10','2014-05-07 14:32:10','',5341,'http://sandbox.arrayfire.com/5341-revision-v1/',0,'revision','',0),(5514,17728,'2014-05-07 18:42:58','2014-05-07 18:42:58','SC13 was awesome this week! Tomorrow is the last day of the exhibition. For those of you that did not make it to the show, here are some pictures from our exhibit:\r\n<p style=\"text-align: center;\"><a href=\"http://blog.accelereyes.com/blog/wp-content/uploads/2013/11/IMG_1450.jpg\"><img class=\"aligncenter  wp-image-4564\" alt=\"IMG_1450\" src=\"http://blog.accelereyes.com/blog/wp-content/uploads/2013/11/IMG_1450.jpg\" width=\"614\" height=\"461\" /></a></p>\r\n<p style=\"text-align: center;\"><img class=\"aligncenter  wp-image-4561\" alt=\"IMG_1457\" src=\"http://blog.accelereyes.com/blog/wp-content/uploads/2013/11/IMG_1457.jpg\" width=\"614\" height=\"532\" /></p>\r\n<p style=\"text-align: center;\"><strong>The AccelerEyes Booth</strong></p>\r\n<p style=\"text-align: center;\">--------------------------------------------------------------------------------------------------------</p>\r\n<p style=\"text-align: center;\"><a href=\"http://blog.accelereyes.com/blog/wp-content/uploads/2013/11/IMG_1451.jpg\"><img class=\"aligncenter  wp-image-4557\" alt=\"IMG_1451\" src=\"http://blog.accelereyes.com/blog/wp-content/uploads/2013/11/IMG_1451.jpg\" width=\"461\" height=\"614\" /></a></p>\r\n<p style=\"text-align: center;\"><strong>ArrayFire OpenCL Demo on ARM Mali</strong></p>\r\n<p style=\"text-align: center;\">--------------------------------------------------------------------------------------------------------</p>\r\n<p style=\"text-align: center;\"><a href=\"http://blog.accelereyes.com/blog/wp-content/uploads/2013/11/IMG_1452.jpg\"><img class=\"aligncenter  wp-image-4558\" alt=\"IMG_1452\" src=\"http://blog.accelereyes.com/blog/wp-content/uploads/2013/11/IMG_1452.jpg\" width=\"461\" height=\"614\" /></a></p>\r\n<p style=\"text-align: center;\"><strong>ArrayFire CUDA Demo on NVIDIA K40</strong></p>\r\n<p style=\"text-align: center;\">--------------------------------------------------------------------------------------------------------</p>\r\n<p style=\"text-align: center;\"><a href=\"http://blog.accelereyes.com/blog/wp-content/uploads/2013/11/IMG_1453.jpg\"><img class=\"aligncenter  wp-image-4559\" alt=\"IMG_1453\" src=\"http://blog.accelereyes.com/blog/wp-content/uploads/2013/11/IMG_1453.jpg\" width=\"461\" height=\"614\" /></a></p>\r\n<p style=\"text-align: center;\"><strong>ArrayFire OpenCL Demo on Intel Xeon Phi Coprocessor</strong></p>\r\n<p style=\"text-align: center;\">--------------------------------------------------------------------------------------------------------</p>\r\n<p style=\"text-align: center;\"><a href=\"http://blog.accelereyes.com/blog/wp-content/uploads/2013/11/IMG_1454.jpg\"><img class=\"aligncenter  wp-image-4560\" alt=\"IMG_1454\" src=\"http://blog.accelereyes.com/blog/wp-content/uploads/2013/11/IMG_1454.jpg\" width=\"461\" height=\"614\" /></a></p>\r\n<p style=\"text-align: center;\"><strong>ArrayFire OpenCL Demo on AMD FirePro GPU</strong></p>\r\n<p style=\"text-align: center;\">--------------------------------------------------------------------------------------------------------</p>\r\n<p style=\"text-align: left;\">It was a great show and wonderful to see so many ArrayFire users in person. If you could not attend and would like to learn more about our CUDA or OpenCL products or services, let us know!</p>\r\n\r\n<h6 class=\"zemanta-related-title\" style=\"font-size: 1em;\">Related articles</h6>\r\n<ul class=\"zemanta-article-ul zemanta-article-ul-image\" style=\"margin: 0; padding: 0; overflow: hidden;\">\r\n	<li class=\"zemanta-article-ul-li-image zemanta-article-ul-li\" style=\"padding: 0; background: none; list-style: none; display: block; float: left; vertical-align: top; text-align: left; width: 84px; font-size: 11px; margin: 2px 10px 10px 2px;\"><a style=\"box-shadow: 0px 0px 4px #999; padding: 2px; display: block; border-radius: 2px; text-decoration: none;\" href=\"http://blog.accelereyes.com/blog/2013/10/07/arrayfire-v2-0-release-candidate-now-available-for-download/\" target=\"_blank\"><img style=\"padding: 0; margin: 0; border: 0; display: block; width: 80px; max-width: 100%;\" alt=\"\" src=\"http://i.zemanta.com/noimg_63_80_80.jpg\" /></a><a style=\"display: block; overflow: hidden; text-decoration: none; line-height: 12pt; height: 80px; padding: 5px 2px 0 2px;\" href=\"http://blog.accelereyes.com/blog/2013/10/07/arrayfire-v2-0-release-candidate-now-available-for-download/\" target=\"_blank\">ArrayFire v2.0 Release Candidate Now Available for Download</a></li>\r\n	<li class=\"zemanta-article-ul-li-image zemanta-article-ul-li\" style=\"padding: 0; background: none; list-style: none; display: block; float: left; vertical-align: top; text-align: left; width: 84px; font-size: 11px; margin: 2px 10px 10px 2px;\"><a style=\"box-shadow: 0px 0px 4px #999; padding: 2px; display: block; border-radius: 2px; text-decoration: none;\" href=\"http://notonlyluck.com/2013/11/18/two-kinds-of-exhibits-to-watch-at-tradeshows/\" target=\"_blank\"><img style=\"padding: 0; margin: 0; border: 0; display: block; width: 80px; max-width: 100%;\" alt=\"\" src=\"http://i.zemanta.com/noimg_124_80_80.jpg\" /></a><a style=\"display: block; overflow: hidden; text-decoration: none; line-height: 12pt; height: 80px; padding: 5px 2px 0 2px;\" href=\"http://notonlyluck.com/2013/11/18/two-kinds-of-exhibits-to-watch-at-tradeshows/\" target=\"_blank\">Two Kinds of Exhibits to Watch at Tradeshows</a></li>\r\n	<li class=\"zemanta-article-ul-li-image zemanta-article-ul-li\" style=\"padding: 0; background: none; list-style: none; display: block; float: left; vertical-align: top; text-align: left; width: 84px; font-size: 11px; margin: 2px 10px 10px 2px;\"><a style=\"box-shadow: 0px 0px 4px #999; padding: 2px; display: block; border-radius: 2px; text-decoration: none;\" href=\"http://www.eweek.com/servers/intel-execs-talk-xeon-phi-at-supercomputing-show.html\" target=\"_blank\"><img style=\"padding: 0; margin: 0; border: 0; display: block; width: 80px; max-width: 100%;\" alt=\"\" src=\"http://i.zemanta.com/222596490_80_80.jpg\" /></a><a style=\"display: block; overflow: hidden; text-decoration: none; line-height: 12pt; height: 80px; padding: 5px 2px 0 2px;\" href=\"http://www.eweek.com/servers/intel-execs-talk-xeon-phi-at-supercomputing-show.html\" target=\"_blank\">Intel Execs Talk Xeon Phi at Supercomputing Show</a></li>\r\n	<li class=\"zemanta-article-ul-li-image zemanta-article-ul-li\" style=\"padding: 0; background: none; list-style: none; display: block; float: left; vertical-align: top; text-align: left; width: 84px; font-size: 11px; margin: 2px 10px 10px 2px;\"><a style=\"box-shadow: 0px 0px 4px #999; padding: 2px; display: block; border-radius: 2px; text-decoration: none;\" href=\"http://www.fool.com/investing/general/2013/11/18/nvidias-partnership-with-ibm-makes-sense.aspx\" target=\"_blank\"><img style=\"padding: 0; margin: 0; border: 0; display: block; width: 80px; max-width: 100%;\" alt=\"\" src=\"http://i.zemanta.com/222178847_80_80.jpg\" /></a><a style=\"display: block; overflow: hidden; text-decoration: none; line-height: 12pt; height: 80px; padding: 5px 2px 0 2px;\" href=\"http://www.fool.com/investing/general/2013/11/18/nvidias-partnership-with-ibm-makes-sense.aspx\" target=\"_blank\">NVIDIA\'s Partnership With IBM Makes Sense</a></li>\r\n	<li class=\"zemanta-article-ul-li-image zemanta-article-ul-li\" style=\"padding: 0; background: none; list-style: none; display: block; float: left; vertical-align: top; text-align: left; width: 84px; font-size: 11px; margin: 2px 10px 10px 2px;\"><a style=\"box-shadow: 0px 0px 4px #999; padding: 2px; display: block; border-radius: 2px; text-decoration: none;\" href=\"http://www.anandtech.com/show/7515/nvidia-announces-cuda-6-unified-memory-for-cuda\" target=\"_blank\"><img style=\"padding: 0; margin: 0; border: 0; display: block; width: 80px; max-width: 100%;\" alt=\"\" src=\"http://i.zemanta.com/220889050_80_80.jpg\" /></a><a style=\"display: block; overflow: hidden; text-decoration: none; line-height: 12pt; height: 80px; padding: 5px 2px 0 2px;\" href=\"http://www.anandtech.com/show/7515/nvidia-announces-cuda-6-unified-memory-for-cuda\" target=\"_blank\">NVIDIA Announces CUDA 6: Unified Memory for CUDA</a></li>\r\n	<li class=\"zemanta-article-ul-li-image zemanta-article-ul-li\" style=\"padding: 0; background: none; list-style: none; display: block; float: left; vertical-align: top; text-align: left; width: 84px; font-size: 11px; margin: 2px 10px 10px 2px;\"><a style=\"box-shadow: 0px 0px 4px #999; padding: 2px; display: block; border-radius: 2px; text-decoration: none;\" href=\"http://www.legitreviews.com/amd-enables-server-apu-software-to-reimagine-the-server_128704\" target=\"_blank\"><img style=\"padding: 0; margin: 0; border: 0; display: block; width: 80px; max-width: 100%;\" alt=\"\" src=\"http://i.zemanta.com/219980829_80_80.jpg\" /></a><a style=\"display: block; overflow: hidden; text-decoration: none; line-height: 12pt; height: 80px; padding: 5px 2px 0 2px;\" href=\"http://www.legitreviews.com/amd-enables-server-apu-software-to-reimagine-the-server_128704\" target=\"_blank\">AMD Enables Server APU Software to Reimagine the Server</a></li>\r\n</ul>\r\n<div class=\"zemanta-pixie\" style=\"margin-top: 10px; height: 15px;\"><a class=\"zemanta-pixie-a\" title=\"Enhanced by Zemanta\" href=\"http://www.zemanta.com/?px\"><img class=\"zemanta-pixie-img\" style=\"border: none; float: right;\" alt=\"Enhanced by Zemanta\" src=\"http://img.zemanta.com/zemified_e.png?x-id=9e9b61cd-6523-444f-a6d3-bc03e1db5626\" /></a></div>','Photos from SC13','','inherit','open','closed','','4543-revision-v1','','','2014-05-07 18:42:58','2014-05-07 18:42:58','',4543,'http://sandbox.arrayfire.com/4543-revision-v1/',0,'revision','',0),(5523,11,'2014-05-09 21:56:05','2014-05-09 21:56:05','<span style=\"line-height: 1.5em;\">Until recently, we had our central git repositories hosted on a virtual machine. This was running on a big, noisy, rack mounted server. We started thinking about cutting down the number of machines we use on a daily basis (Just can\'t stop optimizing). The opportunity popped up during an office move to our new location.</span>\r\n\r\n<span style=\"line-height: 1.5em;\">We had discussed this idea in a few meetings before, but for various reasons, they were not acted upon.</span><span style=\"line-height: 1.5em;\"> During the move</span> <a href=\"https://twitter.com/arshad_umar\" target=\"_blank\">Umar</a> started hacking on <a title=\"GitLab\" href=\"http://https://www.gitlab.com/\" target=\"_blank\">GitLab</a> to get it working for us internally. The office move came as a blessing in disguise. He used one of our old Dell Inspiron laptops that was just gathering dust. We ordered new DDR2 (yes, DDR2) RAM for it and installed Ubuntu. Soon, we were ready to go. It has been about 3 weeks since we have been using GitLab, and it has been nothing but great. Here few of the benefits of deploying GitLab:\r\n<ul>\r\n	<li><strong>Accounts</strong>: Each user has their own account and can manage SSH Keys. Previously we had to semi-automatically distribute keys throughout our build setup.</li>\r\n	<li><strong>Keeping track of commits</strong>: Using git hooks, we had the updates going on a news group. This approach was not popular with many of our developers. Using GitLab, the dashboard shows updates and activities to all the branches and repos that you are either participating or watching.</li>\r\n	<li><strong>Groups</strong>: We do a lot of development, on ArrayFire as well as accelerating software for our customers. GitLab\'s  groups feature makes it easier to isolate independent projects.</li>\r\n	<li><strong>Owners</strong>: Previously access to the development and master branches was only restricted by word of mouth. However this was not always stringently enforced. GitLab made it easier to restrict access to such branches. Only the Owners are allowed to push and anyone else needs so send out a \"Merge Request\" (similar to a pull request on GitHub).</li>\r\n	<li><strong>Merge Requests</strong>: When we want to merge our changes to one of our main branches, we send out a merge request to the branch owners. The owner\'s receive notification and can review the various commits and diffs on a browser and merge the changes.</li>\r\n	<li><strong>Code Review</strong>: Users can add comments to specific lines of code or in general. Comments can also include \"Thumbs Up\" and \"Thumbs Down\" icons which can be used to indicate great work or to indicate votes when doing a code review. We can add comments to comments which makes them look neatly organized.</li>\r\n	<li><strong>Issues</strong>: One of the best parts of GitLab has been the ability to create issues. Previously, we used JIRA to handle this side of our workflow. With GitLab, that extra system has been eliminated. Like JIRA, GitLab allows you to create and close issues. It might not be as robust as JIRA but its nice that is integrated into one tool.</li>\r\n	<li><strong>Stats</strong>: GitLab also creates various statistics and graphs on its own, such as number of commits, lines added and deleted. Each user gets their own chart as well. The only thing we really use this for? Bragging rights.</li>\r\n</ul>\r\n<span style=\"line-height: 1.5em;\">GitLab has been so useful that it has become a pinned tab on my browser (and pretty much everyone else here). It has been the best thing to happen to our workflow since our automated build system on Jenkins (the appreciation of Jenkins will be whole another blog on its own).</span> What your experiences with internal development tools you use?','GitLab at ArrayFire','','publish','open','closed','','gitlab-at-arrayfire','','','2014-05-09 22:12:52','2014-05-09 22:12:52','',0,'http://sandbox.arrayfire.com/?p=5523',0,'post','',0),(5524,11,'2014-05-08 21:08:44','2014-05-08 21:08:44','At GTC 2014, NVIDIA announced the Jetson TK1 mobile supercomputer dev board. We received ours at the start of this week and have been playing around with it.\r\n\r\nThe board is a handy at 5\"x5\". It comes with an active cooling fan similar to ones on most laptops but pretty quiet. The design of the board is ','Jetson TK1','','inherit','open','closed','','5523-revision-v1','','','2014-05-08 21:08:44','2014-05-08 21:08:44','',5523,'http://sandbox.arrayfire.com/5523-revision-v1/',0,'revision','',0),(5527,11,'2014-05-08 22:10:13','2014-05-08 22:10:13','Until recently, we have been using a virtual machine as our git server. The computer that hosted this was a big, noisy, ancient computer that ran XenServer and sat in a server rack.\r\n\r\nWe have been on the move and will be in temporary spaces until we move to our permanent location in Q3. This led us to cut down on the number of computers we depend on, especially our servers. We had to figure out a way to keep our dev loop going without sacrificing work space environment.\r\n\r\nIt was then that Umar started hacking on GitLab to get it working for us internally. We had discussed this idea in a few meetings before, but for various reasons, they were not acted upon. The office move came as a blessing in disguise.\r\n\r\nUmar used one of our old Dell laptops that was just gathering dust. We ordered new DDR2 (yes, DDR2) RAM for it and installed Ubuntu. Soon, we were ready to go.\r\n\r\nIt has been about 3 weeks since we have been using GitLab, and it has been nothing but great. Here few of the benefits of deploying GitLab:\r\n<ul>\r\n	<li><strong>Accounts</strong>: Each user has their own account and can manage SSH Keys. Previously we had to semi-automatically distribute keys throughout our build setup.</li>\r\n	<li><strong>Automatic Email Updates</strong>: Using native git on a server, we had no auto-updates to really know what everyone was working on. Unless we checkout a branch and look at the logs, we would have no idea about the development going except for asking the person who is working on it. Also, the dashboard shows updates and activities to all the branches and repos that you are participating in or have marked as watch.</li>\r\n	<li><strong>Groups and Owners</strong>: In our dev loop, we have various things going on. From adding new features to fixing existing bugs and adding unit tests, benchmarks and examples. This has led to most people \"owning\" a branch of ArrayFire. GitLab has allowed us to restrict push access to these branches. Only the Owners are allowed to push and anyone else needs so send out a \"Merge Request\" (similar to a pull request on GitHub). This has allowed us to restrict access to our main development branch. Any work now needs a new branch followed by a merge request. I had been one of the persons who worked directly on the devel branch. That being said, I am so much more happier now that my access to it restricted. This has made me work on new branches more often and not send out silly commits to the development branch.</li>\r\n	<li><strong>Merge Requests</strong>: As soon as new code is open to be merged, we send out a merge request to the branch owners. The owner\'s receive notification and can review the various commits and diffs on the browser itself. Then we review, comment and create issues as discussed below.</li>\r\n	<li><strong>Reviews and Comments</strong>: Users can add comments to specific lines of code or in general. Comments can also include \"Thumbs Up\" and \"Thumbs Down\" icons which really help in recognizing great work (albeit, we use thumbs up a lot more than thumbs down).  Comments can also include links to external websites as well as GitLab commits which can show that a comment that needs attention has been fixed. Users can also be tagged using the @username handle which sends them an email notification. And lastly, we can add comments to comments which makes them look neatly organized.</li>\r\n	<li><strong>Issues</strong>: One of the best parts of GitLab has been the ability to create issues. Previously, we used Jira to handle this side of our dev loop. However the serious downside of Jira was that it required manual input at most times and had no way to link with git. Jira had become such a chore that at one point we had to make it company rule to have at least 1 Jira action a day. Even that failed to get us developers to use Jira effectively. I\'m not saying that Jira was bad, it most definitely wasn\'t. The issue with Jira was that it was just another system we had to work with. With GitLab, that extra system has been eliminated. The issue system in GitLab provides the ability to create and close issues similar to Jira. But the additional benefits are all in its ability to integrated perfectly with our git activity.</li>\r\n</ul>\r\n<span style=\"line-height: 1.5em;\">GitLab has been so useful that it has become a pinned tab on my browser (and from most people\'s from what I have seen). It have been the best thing to happen to our dev loop since our automated build system on Jenkins (the appreciation of Jenkins is a whole another blog on its own).</span>\r\n\r\nLet us know what your experiences with internal development are and the tools that you use. If you are/have used GitLab in your development, let us know what you think of it and how it affected your productivity.','GitLab','','inherit','open','closed','','5523-revision-v1','','','2014-05-08 22:10:13','2014-05-08 22:10:13','',5523,'http://sandbox.arrayfire.com/5523-revision-v1/',0,'revision','',0),(5528,11,'2014-05-09 14:55:06','2014-05-09 14:55:06','Until recently, we have been using a virtual machine as our git server. The computer that hosted this was a big, noisy, ancient computer that ran XenServer and sat in a server rack.\r\n\r\nWe have been on the move recently and will be in temporary locations until we move to our permanent location in Q3 \'14. This led us to cut down on the number of computers we depend on, especially our servers. We had to figure out a way to keep our dev loop going without sacrificing work space environment.\r\n\r\nIt was then that Umar started hacking on GitLab to get it working for us internally. We had discussed this idea in a few meetings before, but for various reasons, they were not acted upon. The office move came as a blessing in disguise. Umar used one of our old Dell laptops that was just gathering dust. We ordered new DDR2 (yes, DDR2) RAM for it and installed Ubuntu. Soon, we were ready to go.\r\n\r\nIt has been about 3 weeks since we have been using GitLab, and it has been nothing but great. Here few of the benefits of deploying GitLab:\r\n<ul>\r\n	<li><strong>Accounts</strong>: Each user has their own account and can manage SSH Keys. Previously we had to semi-automatically distribute keys throughout our build setup.</li>\r\n	<li><strong>Automatic Email Updates</strong>: Using native git on a server, we had no auto-updates to really know what everyone was working on. Unless we checkout a branch and look at the logs, we would have no idea about the development going except for asking the person who is working on it. Also, the dashboard shows updates and activities to all the branches and repos that you are participating in or have marked as watch.</li>\r\n	<li><strong>Groups and Owners</strong>: In our dev loop, we have various things going on. From adding new features to fixing existing bugs and adding unit tests, benchmarks and examples. This has led to most people \"owning\" a branch of ArrayFire. GitLab has allowed us to restrict push access to these branches. Only the Owners are allowed to push and anyone else needs so send out a \"Merge Request\" (similar to a pull request on GitHub). This has allowed us to restrict access to our main development branch. Any work now needs a new branch followed by a merge request. I had been one of the persons who worked directly on the devel branch. That being said, I am so much more happier now that my access to it restricted. This has made me work on new branches more often and not send out silly commits to the development branch.</li>\r\n	<li><strong>Merge Requests</strong>: As soon as new code is open to be merged, we send out a merge request to the branch owners. The owner\'s receive notification and can review the various commits and diffs on the browser itself. Then we review, comment and create issues as discussed below.</li>\r\n	<li><strong>Reviews and Comments</strong>: Users can add comments to specific lines of code or in general. Comments can also include \"Thumbs Up\" and \"Thumbs Down\" icons which really help in recognizing great work (albeit, we use thumbs up a lot more than thumbs down).  Comments can also include links to external websites as well as GitLab commits which can show that a comment that needs attention has been fixed. Users can also be tagged using the @username handle which sends them an email notification. And lastly, we can add comments to comments which makes them look neatly organized.</li>\r\n	<li><strong>Issues</strong>: One of the best parts of GitLab has been the ability to create issues. Previously, we used Jira to handle this side of our dev loop. However the serious downside of Jira was that it required manual input at most times and had no way to link with git. Jira had become such a chore that at one point we had to make it company rule to have at least 1 Jira action a day. Even that failed to get us developers to use Jira effectively. I\'m not saying that Jira was bad, it most definitely wasn\'t. The issue with Jira was that it was just another system we had to work with. With GitLab, that extra system has been eliminated. The issue system in GitLab provides the ability to create and close issues similar to Jira. But the additional benefits are all in its ability to integrated perfectly with our git activity.</li>\r\n	<li><strong>Stats</strong>: GitLab also creates various statistics and graphs on its own, such as number of commits, lines added and deleted. Each user gets their own chart as well. The only thing we really use this for? Bragging rights.</li>\r\n</ul>\r\n<span style=\"line-height: 1.5em;\">GitLab has been so useful that it has become a pinned tab on my browser (and from most people\'s from what I have seen). It have been the best thing to happen to our dev loop since our automated build system on Jenkins (the appreciation of Jenkins is a whole another blog on its own).</span>\r\n\r\nLet us know what your experiences with internal development are and the tools that you use. If you are/have used GitLab in your development, let us know what you think of it and how it affected your productivity.','GitLab','','inherit','open','closed','','5523-revision-v1','','','2014-05-09 14:55:06','2014-05-09 14:55:06','',5523,'http://sandbox.arrayfire.com/5523-revision-v1/',0,'revision','',0),(5529,11,'2014-05-09 14:55:43','2014-05-09 14:55:43','Until recently, we have been using a virtual machine as our git server. The computer that hosted this was a big, noisy, ancient computer that ran XenServer and sat in a server rack.\r\n\r\nWe have been on the move recently and will be in temporary locations until we move to our permanent location in Q3 \'14. This led us to cut down on the number of computers we depend on, especially our servers. We had to figure out a way to keep our dev loop going without sacrificing work space environment.\r\n\r\nIt was then that Umar started hacking on GitLab to get it working for us internally. We had discussed this idea in a few meetings before, but for various reasons, they were not acted upon. The office move came as a blessing in disguise. Umar used one of our old Dell laptops that was just gathering dust. We ordered new DDR2 (yes, DDR2) RAM for it and installed Ubuntu. Soon, we were ready to go.\r\n\r\nIt has been about 3 weeks since we have been using GitLab, and it has been nothing but great. Here few of the benefits of deploying GitLab:\r\n<ul>\r\n	<li><strong>Accounts</strong>: Each user has their own account and can manage SSH Keys. Previously we had to semi-automatically distribute keys throughout our build setup.</li>\r\n	<li><strong>Automatic Email Updates</strong>: Using native git on a server, we had no auto-updates to really know what everyone was working on. Unless we checkout a branch and look at the logs, we would have no idea about the development going except for asking the person who is working on it. Also, the dashboard shows updates and activities to all the branches and repos that you are participating in or have marked as watch.</li>\r\n	<li><strong>Groups and Owners</strong>: In our dev loop, we have various things going on. From adding new features to fixing existing bugs and adding unit tests, benchmarks and examples. This has led to most people \"owning\" a branch of ArrayFire. GitLab has allowed us to restrict push access to these branches. Only the Owners are allowed to push and anyone else needs so send out a \"Merge Request\" (similar to a pull request on GitHub). This has allowed us to restrict access to our main development branch. Any work now needs a new branch followed by a merge request. I had been one of the persons who worked directly on the devel branch. That being said, I am so much more happier now that my access to it restricted. This has made me work on new branches more often and not send out silly commits to the development branch.</li>\r\n	<li><strong>Merge Requests</strong>: As soon as new code is open to be merged, we send out a merge request to the branch owners. The owner\'s receive notification and can review the various commits and diffs on the browser itself. Then we review, comment and create issues as discussed below.</li>\r\n	<li><strong>Reviews and Comments</strong>: Users can add comments to specific lines of code or in general. Comments can also include \"Thumbs Up\" and \"Thumbs Down\" icons which really help in recognizing great work (albeit, we use thumbs up a lot more than thumbs down).  Comments can also include links to external websites as well as GitLab commits which can show that a comment that needs attention has been fixed. Users can also be tagged using the @username handle which sends them an email notification. And lastly, we can add comments to comments which makes them look neatly organized.</li>\r\n	<li><strong>Issues</strong>: One of the best parts of GitLab has been the ability to create issues. Previously, we used Jira to handle this side of our dev loop. However the serious downside of Jira was that it required manual input at most times and had no way to link with git. Jira had become such a chore that at one point we had to make it company rule to have at least 1 Jira action a day. Even that failed to get us developers to use Jira effectively. I\'m not saying that Jira was bad, it most definitely wasn\'t. The issue with Jira was that it was just another system we had to work with. With GitLab, that extra system has been eliminated. The issue system in GitLab provides the ability to create and close issues similar to Jira. But the additional benefits are all in its ability to integrated perfectly with our git activity.</li>\r\n	<li><strong>Stats</strong>: GitLab also creates various statistics and graphs on its own, such as number of commits, lines added and deleted. Each user gets their own chart as well. The only thing we really use this for? Bragging rights.</li>\r\n</ul>\r\n<span style=\"line-height: 1.5em;\">GitLab has been so useful that it has become a pinned tab on my browser (and from most people\'s from what I have seen). It have been the best thing to happen to our dev loop since our automated build system on Jenkins (the appreciation of Jenkins is a whole another blog on its own).</span>\r\n\r\nLet us know what your experiences with internal development are and the tools that you use. If you are using or have used GitLab in your development, let us know what you think of it and how it affected your productivity.','GitLab','','inherit','open','closed','','5523-revision-v1','','','2014-05-09 14:55:43','2014-05-09 14:55:43','',5523,'http://sandbox.arrayfire.com/5523-revision-v1/',0,'revision','',0),(5530,11,'2014-05-09 15:20:18','2014-05-09 15:20:18','Until recently, we have been using a virtual machine as our git server. The computer that hosted this was a big, noisy, ancient computer that ran XenServer and sat in a server rack.\r\n\r\nWe have been on the move recently and will be in temporary locations until we move to our permanent location in Q3 \'14. This led us to cut down on the number of computers we depend on, especially our servers. We had to figure out a way to keep our dev loop going without sacrificing work space environment.\r\n\r\nIt was then that Umar started hacking on <a title=\"GitLab\" href=\"http://https://www.gitlab.com/\" target=\"_blank\">GitLab</a> to get it working for us internally. We had discussed this idea in a few meetings before, but for various reasons, they were not acted upon. The office move came as a blessing in disguise. Umar used one of our old Dell laptops that was just gathering dust. We ordered new DDR2 (yes, DDR2) RAM for it and installed Ubuntu. Soon, we were ready to go.\r\n\r\nIt has been about 3 weeks since we have been using GitLab, and it has been nothing but great. Here few of the benefits of deploying GitLab:\r\n<ul>\r\n	<li><strong>Accounts</strong>: Each user has their own account and can manage SSH Keys. Previously we had to semi-automatically distribute keys throughout our build setup.</li>\r\n	<li><strong>Automatic Email Updates</strong>: Using native git on a server, we had no auto-updates to really know what everyone was working on. Unless we checkout a branch and look at the logs, we would have no idea about the development going except for asking the person who is working on it. Also, the dashboard shows updates and activities to all the branches and repos that you are participating in or have marked as watch.</li>\r\n	<li><strong>Groups and Owners</strong>: In our dev loop, we have various things going on. From adding new features to fixing existing bugs and adding unit tests, benchmarks and examples. This has led to most people \"owning\" a branch of ArrayFire. GitLab has allowed us to restrict push access to these branches. Only the Owners are allowed to push and anyone else needs so send out a \"Merge Request\" (similar to a pull request on GitHub). This has allowed us to restrict access to our main development branch. Any work now needs a new branch followed by a merge request. I had been one of the persons who worked directly on the devel branch. That being said, I am so much more happier now that my access to it restricted. This has made me work on new branches more often and not send out silly commits to the development branch.</li>\r\n	<li><strong>Merge Requests</strong>: As soon as new code is open to be merged, we send out a merge request to the branch owners. The owner\'s receive notification and can review the various commits and diffs on the browser itself. Then we review, comment and create issues as discussed below.</li>\r\n	<li><strong>Reviews and Comments</strong>: Users can add comments to specific lines of code or in general. Comments can also include \"Thumbs Up\" and \"Thumbs Down\" icons which really help in recognizing great work (albeit, we use thumbs up a lot more than thumbs down).  Comments can also include links to external websites as well as GitLab commits which can show that a comment that needs attention has been fixed. Users can also be tagged using the @username handle which sends them an email notification. And lastly, we can add comments to comments which makes them look neatly organized.</li>\r\n	<li><strong>Issues</strong>: One of the best parts of GitLab has been the ability to create issues. Previously, we used Jira to handle this side of our dev loop. However the serious downside of Jira was that it required manual input at most times and had no way to link with git. Jira had become such a chore that at one point we had to make it company rule to have at least 1 Jira action a day. Even that failed to get us developers to use Jira effectively. I\'m not saying that Jira was bad, it most definitely wasn\'t. The issue with Jira was that it was just another system we had to work with. With GitLab, that extra system has been eliminated. The issue system in GitLab provides the ability to create and close issues similar to Jira. But the additional benefits are all in its ability to integrated perfectly with our git activity.</li>\r\n	<li><strong>Stats</strong>: GitLab also creates various statistics and graphs on its own, such as number of commits, lines added and deleted. Each user gets their own chart as well. The only thing we really use this for? Bragging rights.</li>\r\n</ul>\r\n<span style=\"line-height: 1.5em;\">GitLab has been so useful that it has become a pinned tab on my browser (and for most people\'s from what I have seen). It has been the best thing to happen to our dev loop since our automated build system on Jenkins (the appreciation of Jenkins is a whole another blog on its own).</span>\r\n\r\nLet us know what your experiences with internal development are and the tools that you use. If you are using or have used GitLab in your development, let us know what you think of it and how it affected your productivity.','GitLab','','inherit','open','closed','','5523-revision-v1','','','2014-05-09 15:20:18','2014-05-09 15:20:18','',5523,'http://sandbox.arrayfire.com/5523-revision-v1/',0,'revision','',0),(5531,17728,'2014-05-09 20:46:44','2014-05-09 20:46:44','<span style=\"line-height: 1.5em;\">Until recently, we have been using a virtual machine as our git server. The computer that hosted this was a big, noisy, rack mounted server running a XenServer.</span>\r\n\r\nA few weeks ago, we moved to a temporary location until we move to our permanent location in Q3 \'14. This led us to cut down on the number of computers we depend on, especially our servers. We had to figure out a way to keep our dev loop going without sacrificing work space environment.\r\n\r\nIt was then that <a href=\"https://twitter.com/arshad_umar\" target=\"_blank\">Umar</a> started hacking on <a title=\"GitLab\" href=\"http://https://www.gitlab.com/\" target=\"_blank\">GitLab</a> to get it working for us internally. We had discussed this idea in a few meetings before, but for various reasons, they were not acted upon. The office move came as a blessing in disguise. He used one of our old Dell Inspiron laptops that was just gathering dust. We ordered new DDR2 (yes, DDR2) RAM for it and installed Ubuntu. Soon, we were ready to go.\r\n\r\nIt has been about 3 weeks since we have been using GitLab, and it has been nothing but great. Here few of the benefits of deploying GitLab:\r\n<ul>\r\n	<li><strong>Accounts</strong>: Each user has their own account and can manage SSH Keys. Previously we had to semi-automatically distribute keys throughout our build setup.</li>\r\n	<li><strong>Keeping track of commits</strong>: Using native git on a server, we had the updates going on a news group. This was a bit hard to keep track of. Using GitLab, the dashboard shows updates and activities to all the branches and repos that you are either participating or watching.</li>\r\n	<li><strong>Groups</strong>: We do a lot of development, on ArrayFire as well as accelerating software for our customers. GitLab\'s  groups feature makes it easier to isolate independent projects.</li>\r\n	<li><strong>Owners</strong>: Previously access to the development and master branches was only restricted by word of mouth. However this was not always stringently enforced. GitLab made it easier to restrict access to such branches. Only the Owners are allowed to push and anyone else needs so send out a \"Merge Request\" (similar to a pull request on GitHub). I was one of the developers whose access has been restricted but I happy about this. It forces me to work in feature branches more often and not send out silly commits to our development branch.</li>\r\n	<li><strong>Merge Requests</strong>: As soon as new code is open to be merged, we send out a merge request to the branch owners. The owner\'s receive notification and can review the various commits and diffs on the browser itself. Then we review, comment and create issues as discussed below. This also had the side effect of being a distributed code-review process.</li>\r\n	<li><strong>Reviews and Comments</strong>: Users can add comments to specific lines of code or in general. Comments can also include \"Thumbs Up\" and \"Thumbs Down\" icons which can be used to indicate great work or to indicate votes when doing a code review. We can add comments to comments which makes them look neatly organized.</li>\r\n	<li><strong>Issues</strong>: One of the best parts of GitLab has been the ability to create issues. Previously, we used JIRA to handle this side of our dev loop. However JIRA became just another technology we had to live with. With GitLab, that extra system has been eliminated. The issue system in GitLab provides the ability to create and close issues. It also integrates nicely with git commits and merge requests.</li>\r\n	<li><strong>Stats</strong>: GitLab also creates various statistics and graphs on its own, such as number of commits, lines added and deleted. Each user gets their own chart as well. The only thing we really use this for? Bragging rights.</li>\r\n</ul>\r\n<span style=\"line-height: 1.5em;\">GitLab has been so useful that it has become a pinned tab on my browser (and for most people\'s from what I have seen). It has been the best thing to happen to our dev-loop since our automated build system on Jenkins (the appreciation of Jenkins will be whole another blog on its own).</span>\r\n\r\nLet us know what your experiences with internal development are and the tools that you use. If you are using GitLab, what are your experiences with it ?','Using GitLab at ArrayFire','','inherit','open','closed','','5523-autosave-v1','','','2014-05-09 20:46:44','2014-05-09 20:46:44','',5523,'http://sandbox.arrayfire.com/5523-autosave-v1/',0,'revision','',0),(5533,17728,'2014-05-09 20:55:48','2014-05-09 20:55:48','<span style=\"line-height: 1.5em;\">Until recently, we have been using a virtual machine as our git server. The computer that hosted this was a big, noisy, rack mounted server running a XenServer.</span> A few weeks ago, we moved to a temporary location until we move to our permanent location in Q3 \'14. This led us to cut down on the number of computers we depend on, especially our servers. We had to figure out a way to keep our dev loop going without sacrificing work space environment. It was then that <a href=\"https://twitter.com/arshad_umar\" target=\"_blank\">Umar</a> started hacking on <a title=\"GitLab\" href=\"http://https://www.gitlab.com/\" target=\"_blank\">GitLab</a> to get it working for us internally. We had discussed this idea in a few meetings before, but for various reasons, they were not acted upon. The office move came as a blessing in disguise. He used one of our old Dell Inspiron laptops that was just gathering dust. We ordered new DDR2 (yes, DDR2) RAM for it and installed Ubuntu. Soon, we were ready to go. It has been about 3 weeks since we have been using GitLab, and it has been nothing but great. Here few of the benefits of deploying GitLab:\r\n<ul>\r\n	<li><strong>Accounts</strong>: Each user has their own account and can manage SSH Keys. Previously we had to semi-automatically distribute keys throughout our build setup.</li>\r\n	<li><strong>Keeping track of commits</strong>: Using native git on a server, we had the updates going on a news group. This was a bit hard to keep track of. Using GitLab, the dashboard shows updates and activities to all the branches and repos that you are either participating or watching.</li>\r\n	<li><strong>Groups</strong>: We do a lot of development, on ArrayFire as well as accelerating software for our customers. GitLab\'s  groups feature makes it easier to isolate independent projects.</li>\r\n	<li><strong>Owners</strong>: Previously access to the development and master branches was only restricted by word of mouth. However this was not always stringently enforced. GitLab made it easier to restrict access to such branches. Only the Owners are allowed to push and anyone else needs so send out a \"Merge Request\" (similar to a pull request on GitHub). I was one of the developers whose access has been restricted but I happy about this. It forces me to work in feature branches more often and not send out silly commits to our development branch.</li>\r\n	<li><strong>Merge Requests</strong>: As soon as new code is open to be merged, we send out a merge request to the branch owners. The owner\'s receive notification and can review the various commits and diffs on the browser itself. Then we review, comment and create issues as discussed below. This also had the side effect of being a distributed code-review process.</li>\r\n	<li><strong>Reviews and Comments</strong>: Users can add comments to specific lines of code or in general. Comments can also include \"Thumbs Up\" and \"Thumbs Down\" icons which can be used to indicate great work or to indicate votes when doing a code review. We can add comments to comments which makes them look neatly organized.</li>\r\n	<li><strong>Issues</strong>: One of the best parts of GitLab has been the ability to create issues. Previously, we used JIRA to handle this side of our dev loop. However JIRA became just another technology we had to live with. With GitLab, that extra system has been eliminated. The issue system in GitLab provides the ability to create and close issues. It also integrates nicely with git commits and merge requests.</li>\r\n	<li><strong>Stats</strong>: GitLab also creates various statistics and graphs on its own, such as number of commits, lines added and deleted. Each user gets their own chart as well. The only thing we really use this for? Bragging rights.</li>\r\n</ul>\r\n<span style=\"line-height: 1.5em;\">GitLab has been so useful that it has become a pinned tab on my browser (and for most people\'s from what I have seen). It has been the best thing to happen to our dev-loop since our automated build system on Jenkins (the appreciation of Jenkins will be whole another blog on its own).</span> Let us know what your experiences with internal development are and the tools that you use. If you are using GitLab, what are your experiences with it ?','GitLab','','inherit','open','closed','','5523-revision-v1','','','2014-05-09 20:55:48','2014-05-09 20:55:48','',5523,'http://sandbox.arrayfire.com/5523-revision-v1/',0,'revision','',0),(5535,17794,'2014-05-09 21:05:48','2014-05-09 21:05:48','<span style=\"line-height: 1.5em;\">Until recently, we have been using a virtual machine as our git server. The computer that hosted this was a big, noisy, rack mounted server running a XenServer.</span> A few weeks ago, we moved to a temporary location until we move to our permanent location in Q3 \'14. This led us to cut down on the number of computers we depend on, especially our servers. We had to figure out a way to keep our dev loop going without sacrificing work space environment. It was then that <a href=\"https://twitter.com/arshad_umar\" target=\"_blank\">Umar</a> started hacking on <a title=\"GitLab\" href=\"http://https://www.gitlab.com/\" target=\"_blank\">GitLab</a> to get it working for us internally. We had discussed this idea in a few meetings before, but for various reasons, they were not acted upon. The office move came as a blessing in disguise. He used one of our old Dell Inspiron laptops that was just gathering dust. We ordered new DDR2 (yes, DDR2) RAM for it and installed Ubuntu. Soon, we were ready to go. It has been about 3 weeks since we have been using GitLab, and it has been nothing but great. Here few of the benefits of deploying GitLab:\r\n<ul>\r\n	<li><strong>Accounts</strong>: Each user has their own account and can manage SSH Keys. Previously we had to semi-automatically distribute keys throughout our build setup.</li>\r\n	<li><strong>Keeping track of commits</strong>: Using native git on a server, we had the updates going on a news group. This was a bit hard to keep track of. Using GitLab, the dashboard shows updates and activities to all the branches and repos that you are either participating or watching.</li>\r\n	<li><strong>Groups</strong>: We do a lot of development, on ArrayFire as well as accelerating software for our customers. GitLab\'s  groups feature makes it easier to isolate independent projects.</li>\r\n	<li><strong>Owners</strong>: Previously access to the development and master branches was only restricted by word of mouth. However this was not always stringently enforced. GitLab made it easier to restrict access to such branches. Only the Owners are allowed to push and anyone else needs so send out a \"Merge Request\" (similar to a pull request on GitHub). I was one of the developers whose access has been restricted but I happy about this. It forces me to work in feature branches more often and not send out silly commits to our development branch.</li>\r\n	<li><strong>Merge Requests</strong>: As soon as new code is open to be merged, we send out a merge request to the branch owners. The owner\'s receive notification and can review the various commits and diffs on the browser itself. Then we review, comment and create issues as discussed below. This also had the side effect of being a distributed code-review process.</li>\r\n	<li><strong>Reviews and Comments</strong>: Users can add comments to specific lines of code or in general. Comments can also include \"Thumbs Up\" and \"Thumbs Down\" icons which can be used to indicate great work or to indicate votes when doing a code review. We can add comments to comments which makes them look neatly organized.</li>\r\n	<li><strong>Issues</strong>: One of the best parts of GitLab has been the ability to create issues. Previously, we used JIRA to handle this side of our dev loop. However JIRA became just another technology we had to live with. With GitLab, that extra system has been eliminated. The issue system in GitLab provides the ability to create and close issues. It also integrates nicely with git commits and merge requests.</li>\r\n	<li><strong>Stats</strong>: GitLab also creates various statistics and graphs on its own, such as number of commits, lines added and deleted. Each user gets their own chart as well. The only thing we really use this for? Bragging rights.</li>\r\n</ul>\r\n<span style=\"line-height: 1.5em;\">GitLab has been so useful that it has become a pinned tab on my browser (and for most people\'s from what I have seen). It has been the best thing to happen to our dev-loop since our automated build system on Jenkins (the appreciation of Jenkins will be whole another blog on its own).</span> Let us know what your experiences with internal development are and the tools that you use. If you are using GitLab, what are your experiences with it ?','GitLab','','inherit','open','closed','','5523-autosave-v1','','','2014-05-09 21:05:48','2014-05-09 21:05:48','',5523,'http://sandbox.arrayfire.com/5523-autosave-v1/',0,'revision','',0),(5536,17794,'2014-05-09 21:50:54','2014-05-09 21:50:54','<span style=\"line-height: 1.5em;\">Until recently, we had our central git repositories hosted on a virtual machine. This was running on a big, noisy, rack mounted server. We started thinking about cutting down the number of machines we use on a daily basis (Just can\'t stop optimizing). The opportunity popped up during an office move to our new location.</span>\r\n\r\n<span style=\"line-height: 1.5em;\">We had discussed this idea in a few meetings before, but for various reasons, they were not acted upon.</span><span style=\"line-height: 1.5em;\"> During the move</span> <a href=\"https://twitter.com/arshad_umar\" target=\"_blank\">Umar</a> started hacking on <a title=\"GitLab\" href=\"http://https://www.gitlab.com/\" target=\"_blank\">GitLab</a> to get it working for us internally. The office move came as a blessing in disguise. He used one of our old Dell Inspiron laptops that was just gathering dust. We ordered new DDR2 (yes, DDR2) RAM for it and installed Ubuntu. Soon, we were ready to go. It has been about 3 weeks since we have been using GitLab, and it has been nothing but great. Here few of the benefits of deploying GitLab:\r\n<ul>\r\n	<li><strong>Accounts</strong>: Each user has their own account and can manage SSH Keys. Previously we had to semi-automatically distribute keys throughout our build setup.</li>\r\n	<li><strong>Keeping track of commits</strong>: Using git hooks, we had the updates going on a news group. This approach was not popular with many of our developers. Using GitLab, the dashboard shows updates and activities to all the branches and repos that you are either participating or watching.</li>\r\n	<li><strong>Groups</strong>: We do a lot of development, on ArrayFire as well as accelerating software for our customers. GitLab\'s  groups feature makes it easier to isolate independent projects.</li>\r\n	<li><strong>Owners</strong>: Previously access to the development and master branches was only restricted by word of mouth. However this was not always stringently enforced. GitLab made it easier to restrict access to such branches. Only the Owners are allowed to push and anyone else needs so send out a \"Merge Request\" (similar to a pull request on GitHub).</li>\r\n	<li><strong>Merge Requests</strong>: When we want to merge our changes to one of our main branches, we send out a merge request to the branch owners. The owner\'s receive notification and can review the various commits and diffs on a browser and merge the changes.</li>\r\n	<li><strong>Code Review</strong>: Users can add comments to specific lines of code or in general. Comments can also include \"Thumbs Up\" and \"Thumbs Down\" icons which can be used to indicate great work or to indicate votes when doing a code review. We can add comments to comments which makes them look neatly organized.</li>\r\n	<li><strong>Issues</strong>: One of the best parts of GitLab has been the ability to create issues. Previously, we used JIRA to handle this side of our workflow. With GitLab, that extra system has been eliminated. Like JIRA, GitLab allows you to create and close issues. It might not be as robust as JIRA but its nice that is integrated into one tool.</li>\r\n	<li><strong>Stats</strong>: GitLab also creates various statistics and graphs on its own, such as number of commits, lines added and deleted. Each user gets their own chart as well. The only thing we really use this for? Bragging rights.</li>\r\n</ul>\r\n<span style=\"line-height: 1.5em;\">GitLab has been so useful that it has become a pinned tab on my browser (and pretty much everyone else here). It has been the best thing to happen to our workflow since our automated build system on Jenkins (the appreciation of Jenkins will be whole another blog on its own).</span> What your experiences with internal development tools you use?','GitLab at ArrayFire','','inherit','open','closed','','5523-revision-v1','','','2014-05-09 21:50:54','2014-05-09 21:50:54','',5523,'http://sandbox.arrayfire.com/5523-revision-v1/',0,'revision','',0),(5538,17728,'2014-05-15 20:22:03','2014-05-15 20:22:03','<span style=\"line-height: 1.5em;\">At ArrayFire we like to use a lot of Free/Open Source software. We use various Linux distributions, </span><a style=\"line-height: 1.5em;\" href=\"http://jenkins-ci.org/\">Jenkins</a><span style=\"line-height: 1.5em;\">, </span><a style=\"line-height: 1.5em;\" href=\"https://www.gitlab.com/\">Gitlab</a><span style=\"line-height: 1.5em;\">, gcc, emacs, vim and numerous other <abbr title=\"Free Open Source Software\">FOSS</abbr> tools on a daily basis.</span>\r\n\r\n<span style=\"line-height: 1.5em;\">We also love the idea of developing software collaboratively and openly. Last year we started <a href=\"http://sandbox.arrayfire.com/clmath-an-open-source-blas-and-fft-library-for-opencl/\">working with AMD</a> on <a href=\"https://github.com/clMathLibraries/\">CL Math Libraries</a>. Internally we\'ve had numerous discussions about contributing to the <abbr title=\"General Purpose Graphrics Processing Unit\">GPGPU</abbr> community. However, it\'s neither simple nor straightforward to take a closed software Open Source. </span>Earlier this year, we decided to take the first step and Open Source all of the ArrayFire library\'s  tertiary projects. This includes all of our ArrayFire library\'s language wrappers, examples, and source code used for our blog posts. All of our projects are hosted at <a href=\"https://github.com/arrayfire\">our GitHub page</a>.\r\n\r\nThese are some of the projects  you will find on our GitHub page:\r\n<ul>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\r\n</ul>\r\nAdditionally, some of our users have also created a GitHub page to host projects developed by our community. If you are an ArrayFire library user and have any projects you would like to share, please go to our <a href=\"https://github.com/arrayfire-community\">ArrayFire community</a> page and contribute!\r\n\r\nWe are working towards even bigger things in the future!','Open Source Initiatives from ArrayFire','','publish','open','closed','','open-source-initiatives-from-arrayfire','','','2014-05-15 20:56:23','2014-05-15 20:56:23','',0,'http://sandbox.arrayfire.com/?p=5538',0,'post','',0),(5539,17728,'2014-05-12 17:04:18','2014-05-12 17:04:18','','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-revision-v1','','','2014-05-12 17:04:18','2014-05-12 17:04:18','',5538,'http://sandbox.arrayfire.com/5538-revision-v1/',0,'revision','',0),(5542,17728,'2014-05-12 17:15:55','2014-05-12 17:15:55','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"\r\n\r\nAnd here\'s our response.\r\n\r\nThe GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations ? Choose the Tesla K20, or the K40\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations ? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute ? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or are not worried about double precision or ECC memory ? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, the AMD, Intel and others come into the fray as well. However we will talk about that another day.\r\n\r\n&nbsp;\r\n\r\n&nbsp;','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:15:55','2014-05-12 17:15:55','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5543,17728,'2014-05-12 17:17:09','2014-05-12 17:17:09','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"\r\n\r\nAnd here\'s our response.\r\n\r\nThe GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations ? Choose the Tesla K20, or the K40\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations ? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute ? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or are not worried about double precision and ECC memory ? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, the AMD, Intel and others come into the fray as well. However we will talk about that another day.\r\n\r\n&nbsp;\r\n\r\n&nbsp;','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:17:09','2014-05-12 17:17:09','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5544,17728,'2014-05-12 17:17:26','2014-05-12 17:17:26','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"\r\n\r\nAnd here\'s our response.\r\n\r\nThe GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations ? Choose the Tesla K20, or the K40\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations ? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute ? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or are not worried about double precision and ECC memory ? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel and others come into the fray as well. However we will talk about that another day.\r\n\r\n&nbsp;\r\n\r\n&nbsp;','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:17:26','2014-05-12 17:17:26','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5545,17728,'2014-05-12 17:17:41','2014-05-12 17:17:41','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"\r\n\r\nAnd here\'s our response.\r\n\r\nThe GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations ? Choose the Tesla K20, or the K40\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations ? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute ? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or are not worried about double precision and ECC memory ? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel and other devices come into the fray as well. However we will talk about that another day.\r\n\r\n&nbsp;\r\n\r\n&nbsp;','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:17:41','2014-05-12 17:17:41','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5546,17728,'2014-05-12 17:18:41','2014-05-12 17:18:41','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n<blockquote>\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"</blockquote>\r\nAnd here\'s our response.\r\n<blockquote>The GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).</blockquote>\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations ? Choose the Tesla K20, or the K40\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations ? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute ? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or are not worried about double precision and ECC memory ? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel and other devices come into the fray as well. However we will talk about that another day.\r\n\r\n&nbsp;\r\n\r\n&nbsp;','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:18:41','2014-05-12 17:18:41','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5547,17728,'2014-05-12 17:19:11','2014-05-12 17:19:11','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"\r\n\r\nAnd here\'s our response.\r\n\r\nThe GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations ? Choose the Tesla K20, or the K40\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations ? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute ? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or are not worried about double precision and ECC memory ? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel and other devices come into the fray as well. However we will talk about that another day.\r\n\r\n&nbsp;\r\n\r\n&nbsp;','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:19:11','2014-05-12 17:19:11','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5548,17728,'2014-05-12 17:19:33','2014-05-12 17:19:33','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n<em>\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"</em>\r\n\r\nAnd here\'s our response.\r\n\r\n<em>\"The GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\"</em>\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations ? Choose the Tesla K20, or the K40\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations ? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute ? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or are not worried about double precision and ECC memory ? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel and other devices come into the fray as well. However we will talk about that another day.\r\n\r\n&nbsp;\r\n\r\n&nbsp;','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:19:33','2014-05-12 17:19:33','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5549,17728,'2014-05-12 17:25:59','2014-05-12 17:25:59','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n<em>\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"</em>\r\n\r\nAnd here\'s our response.\r\n\r\n<em>\"The GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\"</em>\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations? Choose the Tesla K20, or the K40.\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or are not worried about double precision and ECC memory? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel and other devices come into the fray as well. However we will talk about that another day.\r\n\r\n&nbsp;\r\n\r\n&nbsp;','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:25:59','2014-05-12 17:25:59','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5551,17728,'2014-05-12 17:29:19','2014-05-12 17:29:19','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n<em>\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"</em>\r\n\r\nAnd here\'s our response.\r\n\r\n<em>\"The GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\"</em>\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations? Choose the Tesla K20, or the K40.\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or not worried about double precision and ECC memory? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel and other devices come into the fray as well. However we will talk about that another day.\r\n\r\n&nbsp;\r\n\r\n&nbsp;','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:29:19','2014-05-12 17:29:19','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5552,17728,'2014-05-12 17:32:31','2014-05-12 17:32:31','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n<em>\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"</em>\r\n\r\nAnd here\'s our response.\r\n\r\n<em>\"The GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\"</em>\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations? Choose the Tesla K20, or the K40.\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or not worried about double precision and ECC memory? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel, and other devices come into the fray as well. However, we will talk about that another day!','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:32:31','2014-05-12 17:32:31','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5553,17728,'2014-05-12 17:33:17','2014-05-12 17:33:17','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n<em>\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"</em>\r\n\r\nAnd here\'s our response.\r\n\r\n<em>\"The GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\"</em>\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations? Choose the Tesla K20, or the K40.\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or not worried about double precision and ECC memory? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel, and other devices come into the fray as well. We will talk about that another day!','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:33:17','2014-05-12 17:33:17','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5554,6,'2014-05-12 17:44:19','2014-05-12 17:44:19','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n<em>\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"</em>\r\n\r\nAnd here\'s our response.\r\n\r\n<em>\"The GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\"</em>\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations? Choose the Tesla K20, or the K40.\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or not worried about double precision and ECC memory? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel, and other devices come into the fray as well. We will talk about that another day!\r\n\r\nDo you have any questions about GPUs? <a href=\"sales@arrayfire.com\">Contact us</a>!','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:44:19','2014-05-12 17:44:19','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5555,6,'2014-05-12 17:46:41','2014-05-12 17:46:41','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n<em>\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"</em>\r\n\r\nAnd here\'s our response.\r\n\r\n<em>\"The GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\"</em>\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations? Choose the Tesla K20, or the K40.\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization / video rendering along with compute? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or not worried about double precision and ECC memory? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel, and other devices come into the fray as well. We will talk about that another day!\r\n\r\nDo you have any questions about GPUs? <a href=\"http://sandbox.arrayfire.com/company/#contact\">Contact us</a>!','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:46:41','2014-05-12 17:46:41','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5556,6,'2014-05-12 17:49:37','2014-05-12 17:49:37','We get questions all the time about how to make GPU hardware decisions. We\'ve seen just about every scenario you can imagine, and so we always jump at the chance to help others through this decision process.\r\n\r\n<span style=\"line-height: 1.5em;\">Here\'s a recent question from a customer.</span>\r\n\r\n<em>\"I\'ve just found your post on Analytic Bridge and have taken a look at your website ... I\'m replacing my two Tesla M1060 cards (computing capability too low) and I\'m considering used Tesla M2070s or the new GTX 760 cards. Could you offer any insight? I believe the GTX 760 cards may well outperform the older 2070s and are much cheaper.\"</em>\r\n\r\nAnd here\'s our response.\r\n\r\n<em>\"The GTX 760 will probably outperform the M2070 for single precision FLOPS but not for double precision, if that matters to you. Not sure what your budget is, but there are other GeForce GPUs that are a lot cheaper than Tesla that have a control panel option to sacrifice clocks for higher double precision throughput (see GeForce GTX Titan).\"</em>\r\n\r\nWe\'ve found that there\'s a lot of confusion out there regarding what\'s the best compute hardware for people who are restricted within a certain price range. A few key takeaways should be considered when trying to make the best GPU hardware decision. Here are some best practices you should consider.\r\n\r\n1) Do you want a reliable GPU that does fast double precision calculations? Choose the Tesla K20, or the K40.\r\n\r\n2) Do you want a reliable GPU that does fast single precision calculations? Tesla K10 is for you.\r\n\r\n3) Are you doing a lot of visualization or video rendering along with compute? Choose the Quadro line.\r\n\r\n4) Are you an enthusiast or not worried about double precision and ECC memory? Buy a GTX GPU within your budget.\r\n\r\nIf you are working with OpenCL, then AMD, Intel, and other devices come into the fray as well. We will talk about that another day!\r\n\r\nDo you have any questions about GPUs? <a href=\"http://sandbox.arrayfire.com/company/#contact\">Contact us</a>!','How to Make GPU Hardware Decisions','','inherit','open','closed','','4685-revision-v1','','','2014-05-12 17:49:37','2014-05-12 17:49:37','',4685,'http://sandbox.arrayfire.com/4685-revision-v1/',0,'revision','',0),(5558,17728,'2014-05-15 19:40:37','2014-05-15 19:40:37','We use a lot of Free / Open Source software at ArrayFire. Here is a small list of FOSS software used by us on a daily basis.\r\n<ul>\r\n	<li><strong>Linux: </strong>The Operating System of choice for our developers.</li>\r\n	<li><strong>Jenkins: </strong>For continuous integration</li>\r\n	<li><strong>Gitlab: </strong>As our git server.</li>\r\n	<li><strong>gcc, emacs, vim </strong>and more.</li>\r\n</ul>\r\nLately we have been seeing more and more companies go Open Source route including a few surprising names (Microsoft, who would have thought!).\r\n\r\nAll of our language wrappers for ArrayFire:\r\n<ul>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\r\n</ul>\r\nHere are a few other projects we have open sourced:\r\n<ul>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\"><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\r\n</ul>\r\nWe are working towards even bigger things. Keep checking back!','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-revision-v1','','','2014-05-15 19:40:37','2014-05-15 19:40:37','',5538,'http://sandbox.arrayfire.com/5538-revision-v1/',0,'revision','',0),(5559,17728,'2014-05-15 19:51:41','2014-05-15 19:51:41','Lately we have seen many companies embrace this and go the Open Source route. This includes a few surprising names  like Microsoft (who would have thought!).\r\n\r\nAt ArrayFire we love and use a lot of Free / Open Source software. We use various Linux distributions, <a href=\"http://jenkins-ci.org/\">Jenkins</a>, <a href=\"https://www.gitlab.com/\">Gitlab</a>, gcc, emacs, vim and numerous other FOSS software on a daily basis.\r\n\r\n<span style=\"line-height: 1.5em;\">We also love the idea of developing software collaboratively and openly. Last year we started working with AMD on [CL Math Libraries](https://github.com/clMathLibraries/).\r\n</span>\r\n\r\nAll of our language wrappers for ArrayFire:\r\n<ul>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\r\n</ul>\r\nHere are a few other projects we have open sourced:\r\n<ul>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\"><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\r\n</ul>\r\nWe are working towards even bigger things. Keep checking back!','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-revision-v1','','','2014-05-15 19:51:41','2014-05-15 19:51:41','',5538,'http://sandbox.arrayfire.com/5538-revision-v1/',0,'revision','',0),(5560,17728,'2014-05-15 19:58:36','2014-05-15 19:58:36','Lately we have seen many companies Open Source their products. This includes a few surprising names  like Microsoft (who would have thought!).\r\n\r\nAt ArrayFire we love and use a lot of Free / Open Source software. We use various Linux distributions, <a href=\"http://jenkins-ci.org/\">Jenkins</a>, <a href=\"https://www.gitlab.com/\">Gitlab</a>, gcc, emacs, vim and numerous other FOSS software on a daily basis.\r\n\r\n<span style=\"line-height: 1.5em;\">We also love the idea of developing software collaboratively and openly. Last year we started <a href=\"http://sandbox.arrayfire.com/clmath-an-open-source-blas-and-fft-library-for-opencl/\">working with AMD</a> on <a href=\"https://github.com/clMathLibraries/\">CL Math Libraries</a>.\r\n</span>\r\n\r\nAll of our language wrappers for ArrayFire:\r\n<ul>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\r\n</ul>\r\nOther products projects to ArrayFire:\r\n<ul>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\"><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\r\n</ul>\r\nSome of our users have also created a github page to host projects developed by our community. If you are an ArrayFire user have any projects you would like to share, please go to our <a href=\"https://github.com/arrayfire-community\">ArrayFire community</a> github page and add your project!\r\n\r\nThis is but a small step from us towards the eventual goal. We are working towards even bigger things.\r\n\r\nKeep checking back!','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-revision-v1','','','2014-05-15 19:58:36','2014-05-15 19:58:36','',5538,'http://sandbox.arrayfire.com/5538-revision-v1/',0,'revision','',0),(5564,17728,'2014-05-15 20:06:02','2014-05-15 20:06:02','Lately we have seen many companies Open Source their products. This includes a few surprising names  like Microsoft (who would have thought!).\r\n\r\nAt ArrayFire we love and use a lot of Free / Open Source software. We use various Linux distributions, <a href=\"http://jenkins-ci.org/\">Jenkins</a>, <a href=\"https://www.gitlab.com/\">Gitlab</a>, gcc, emacs, vim and numerous other FOSS software on a daily basis.\r\n\r\n<span style=\"line-height: 1.5em;\">We also love the idea of developing software collaboratively and openly. Last year we started <a href=\"http://sandbox.arrayfire.com/clmath-an-open-source-blas-and-fft-library-for-opencl/\">working with AMD</a> on <a href=\"https://github.com/clMathLibraries/\">CL Math Libraries</a>. Internally we have had numerous discussions about doing more openly. However it is neither simple nor straightforward to take a closed software Open Source. </span>Earlier this year we decided to take the first step and Open Source all of ArrayFire\'s tertiary projects. This includes all of ArrayFire\'s language wrappers, ArrayFire\'s examples, and source code used for our blog posts. All of our projects are hosted at <a href=\"https://github.com/arrayfire\">our github page</a>.\r\n\r\nSome of the projects we have Open Sourced so far:\r\n<ul>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\"><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\r\n</ul>\r\nSome of our users have also created a github page to host projects developed by our community. If you are an ArrayFire user have any projects you would like to share, please go to our <a href=\"https://github.com/arrayfire-community\">ArrayFire community</a> github page and add your project!\r\n\r\nThis is but a small step from us towards the eventual goal. We are working towards even bigger things.\r\n\r\nKeep checking back!','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-revision-v1','','','2014-05-15 20:06:02','2014-05-15 20:06:02','',5538,'http://sandbox.arrayfire.com/5538-revision-v1/',0,'revision','',0),(5565,17794,'2014-05-15 20:21:40','2014-05-15 20:21:40','<span style=\"line-height: 1.5em;\">At ArrayFire we love and use a lot of Free / Open Source software. We use various Linux distributions, </span><a style=\"line-height: 1.5em;\" href=\"http://jenkins-ci.org/\">Jenkins</a><span style=\"line-height: 1.5em;\">, </span><a style=\"line-height: 1.5em;\" href=\"https://www.gitlab.com/\">Gitlab</a><span style=\"line-height: 1.5em;\">, gcc, emacs, vim and numerous other <abbr title=\"Free Open Source Software\">FOSS</abbr> on a daily basis.</span>\r\n\r\n<span style=\"line-height: 1.5em;\">We also love the idea of developing software collaboratively and openly. Last year we started <a href=\"http://sandbox.arrayfire.com/clmath-an-open-source-blas-and-fft-library-for-opencl/\">working with AMD</a> on <a href=\"https://github.com/clMathLibraries/\">CL Math Libraries</a>. Internally we have had numerous discussions about contributing to the <abbr title=\"General Purpose Graphrics Processing Unit\">GPGPU</abbr> community. However it is neither simple nor straightforward to take a closed software Open Source. </span>Earlier this year we decided to take the first step and Open Source all of ArrayFire\'s tertiary projects. This includes all of ArrayFire\'s language wrappers, ArrayFire\'s examples, and source code used for our blog posts. All of our projects are hosted at <a href=\"https://github.com/arrayfire\">our GitHub page</a>.\r\n\r\nThese are some of the projects  you will find on our GitHub page:\r\n<ul>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\r\n</ul>\r\nAdditionally some of our users have also created a GitHub page to host projects developed by our community. If you are an ArrayFire user and have any projects you would like to share, please go to our <a href=\"https://github.com/arrayfire-community\">ArrayFire community</a> page and contribute!\r\n\r\nAt ArrayFire we are working towards even bigger things in the future!','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-autosave-v1','','','2014-05-15 20:21:40','2014-05-15 20:21:40','',5538,'http://sandbox.arrayfire.com/5538-autosave-v1/',0,'revision','',0),(5566,17728,'2014-05-15 20:10:27','2014-05-15 20:10:27','Lately we have seen many companies Open Source their products. This includes a few surprising names  like Microsoft (who would have thought!).\n\nAt ArrayFire we love and use a lot of Free / Open Source software. We use various Linux distributions, <a href=\"http://jenkins-ci.org/\">Jenkins</a>, <a href=\"https://www.gitlab.com/\">Gitlab</a>, gcc, emacs, vim and numerous other FOSS software on a daily basis.\n\n<span style=\"line-height: 1.5em;\">We also love the idea of developing software collaboratively and openly. Last year we started <a href=\"http://sandbox.arrayfire.com/clmath-an-open-source-blas-and-fft-library-for-opencl/\">working with AMD</a> on <a href=\"https://github.com/clMathLibraries/\">CL Math Libraries</a>. Internally we have had numerous discussions about doing more openly. However it is neither simple nor straightforward to take a closed software Open Source. </span>Earlier this year we decided to take the first step and Open Source all of ArrayFire\'s tertiary projects. This includes all of ArrayFire\'s language wrappers, ArrayFire\'s examples, and source code used for our blog posts. All of our projects are hosted at <a href=\"https://github.com/arrayfire\">our github page</a>.\n\nSome of the projects we have Open Sourced so far:\n<ul>\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\"><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></a></li>\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\n</ul>\nSome of our users have also created a github page to host projects developed by our community. If you are an ArrayFire user have any projects you would like to share, please go to our <a href=\"https://github.com/arrayfire-community\">ArrayFire community</a> github page and add your project!\n\nThis is but a small step from us towards the eventual goal. We are working towards even bigger things.\n\nKeep checking back!','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-autosave-v1','','','2014-05-15 20:10:27','2014-05-15 20:10:27','',5538,'http://sandbox.arrayfire.com/5538-autosave-v1/',0,'revision','',0),(5568,17794,'2014-05-15 20:19:59','2014-05-15 20:19:59','<span style=\"line-height: 1.5em;\">At ArrayFire we love and use a lot of Free / Open Source software. We use various Linux distributions, </span><a style=\"line-height: 1.5em;\" href=\"http://jenkins-ci.org/\">Jenkins</a><span style=\"line-height: 1.5em;\">, </span><a style=\"line-height: 1.5em;\" href=\"https://www.gitlab.com/\">Gitlab</a><span style=\"line-height: 1.5em;\">, gcc, emacs, vim and numerous other <abbr title=\"Free Open Source Software\">FOSS</abbr> on a daily basis.</span>\r\n\r\n<span style=\"line-height: 1.5em;\">We also love the idea of developing software collaboratively and openly. Last year we started <a href=\"http://sandbox.arrayfire.com/clmath-an-open-source-blas-and-fft-library-for-opencl/\">working with AMD</a> on <a href=\"https://github.com/clMathLibraries/\">CL Math Libraries</a>. Internally we have had numerous discussions about contributing to the <abbr title=\"General Purpose Graphrics Processing Unit\">GPGPU</abbr> community. However it is neither simple nor straightforward to take a closed software Open Source. </span>Earlier this year we decided to take the first step and Open Source all of ArrayFire\'s tertiary projects. This includes all of ArrayFire\'s language wrappers, ArrayFire\'s examples, and source code used for our blog posts. All of our projects are hosted at <a href=\"https://github.com/arrayfire\">our GitHub page</a>.\r\n\r\nThese are some of the projects  you will find on our GitHub page:\r\n<ul>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\r\n</ul>\r\nAdditionally some of our users have also created a GitHub page to host projects developed by our community. If you are an ArrayFire user and have any projects you would like to share, please go to our <a href=\"https://github.com/arrayfire-community\">ArrayFire community</a> page and contribute!\r\n\r\nAt ArrayFire we are working towards even bigger things in the future!','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-revision-v1','','','2014-05-15 20:19:59','2014-05-15 20:19:59','',5538,'http://sandbox.arrayfire.com/5538-revision-v1/',0,'revision','',0),(5570,6,'2014-05-15 20:50:46','2014-05-15 20:50:46','<span style=\"line-height: 1.5em;\">At ArrayFire we like to use a lot of Free/Open Source software. We use various Linux distributions, </span><a style=\"line-height: 1.5em;\" href=\"http://jenkins-ci.org/\">Jenkins</a><span style=\"line-height: 1.5em;\">, </span><a style=\"line-height: 1.5em;\" href=\"https://www.gitlab.com/\">Gitlab</a><span style=\"line-height: 1.5em;\">, gcc, emacs, vim and numerous other <abbr title=\"Free Open Source Software\">FOSS</abbr> on a daily basis.</span>\n\n<span style=\"line-height: 1.5em;\">We also love the idea of developing software collaboratively and openly. Last year we started <a href=\"http://sandbox.arrayfire.com/clmath-an-open-source-blas-and-fft-library-for-opencl/\">working with AMD</a> on <a href=\"https://github.com/clMathLibraries/\">CL Math Libraries</a>. Internally we\'ve had numerous discussions about contributing to the <abbr title=\"General Purpose Graphrics Processing Unit\">GPGPU</abbr> community. However, it is neither simple nor straightforward to take a closed software Open Source. </span>Earlier this year, we decided to take the first step and Open Source all of the ArrayFire library\'s  tertiary projects. This includes all of our ArrayFire library\'s language wrappers, examples, and source code used for our blog posts. All of our projects are hosted at <a href=\"https://github.com/arrayfire\">our GitHub page</a>.\n\nThese are some of the projects  you will find on our GitHub page:\n<ul>\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\n	<li><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></li>\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\n</ul>\nAdditionally, some of our users have also created a GitHub page to host projects developed by our community. If you are an ArrayFire library user and have any projects you would like to share, please go to our <a href=\"https://github.com/arrayfire-community\">ArrayFire community</a> page and contribute!\n\nAt ArrayFire we are working towards even bigger things in the future!','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-autosave-v1','','','2014-05-15 20:50:46','2014-05-15 20:50:46','',5538,'http://sandbox.arrayfire.com/5538-autosave-v1/',0,'revision','',0),(5571,6,'2014-05-15 20:51:23','2014-05-15 20:51:23','<span style=\"line-height: 1.5em;\">At ArrayFire we like to use a lot of Free/Open Source software. We use various Linux distributions, </span><a style=\"line-height: 1.5em;\" href=\"http://jenkins-ci.org/\">Jenkins</a><span style=\"line-height: 1.5em;\">, </span><a style=\"line-height: 1.5em;\" href=\"https://www.gitlab.com/\">Gitlab</a><span style=\"line-height: 1.5em;\">, gcc, emacs, vim and numerous other <abbr title=\"Free Open Source Software\">FOSS</abbr> on a daily basis.</span>\r\n\r\n<span style=\"line-height: 1.5em;\">We also love the idea of developing software collaboratively and openly. Last year we started <a href=\"http://sandbox.arrayfire.com/clmath-an-open-source-blas-and-fft-library-for-opencl/\">working with AMD</a> on <a href=\"https://github.com/clMathLibraries/\">CL Math Libraries</a>. Internally we\'ve had numerous discussions about contributing to the <abbr title=\"General Purpose Graphrics Processing Unit\">GPGPU</abbr> community. However, it is neither simple nor straightforward to take a closed software Open Source. </span>Earlier this year, we decided to take the first step and Open Source all of the ArrayFire library\'s  tertiary projects. This includes all of our ArrayFire library\'s language wrappers, examples, and source code used for our blog posts. All of our projects are hosted at <a href=\"https://github.com/arrayfire\">our GitHub page</a>.\r\n\r\nThese are some of the projects  you will find on our GitHub page:\r\n<ul>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\r\n</ul>\r\nAdditionally, some of our users have also created a GitHub page to host projects developed by our community. If you are an ArrayFire library user and have any projects you would like to share, please go to our <a href=\"https://github.com/arrayfire-community\">ArrayFire community</a> page and contribute!\r\n\r\nWe are working towards even bigger things in the future!','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-revision-v1','','','2014-05-15 20:51:23','2014-05-15 20:51:23','',5538,'http://sandbox.arrayfire.com/5538-revision-v1/',0,'revision','',0),(5572,6,'2014-05-15 20:52:44','2014-05-15 20:52:44','<span style=\"line-height: 1.5em;\">At ArrayFire we like to use a lot of Free/Open Source software. We use various Linux distributions, </span><a style=\"line-height: 1.5em;\" href=\"http://jenkins-ci.org/\">Jenkins</a><span style=\"line-height: 1.5em;\">, </span><a style=\"line-height: 1.5em;\" href=\"https://www.gitlab.com/\">Gitlab</a><span style=\"line-height: 1.5em;\">, gcc, emacs, vim and numerous other <abbr title=\"Free Open Source Software\">FOSS</abbr> on a daily basis.</span>\r\n\r\n<span style=\"line-height: 1.5em;\">We also love the idea of developing software collaboratively and openly. Last year we started <a href=\"http://sandbox.arrayfire.com/clmath-an-open-source-blas-and-fft-library-for-opencl/\">working with AMD</a> on <a href=\"https://github.com/clMathLibraries/\">CL Math Libraries</a>. Internally we\'ve had numerous discussions about contributing to the <abbr title=\"General Purpose Graphrics Processing Unit\">GPGPU</abbr> community. However, it\'s neither simple nor straightforward to take a closed software Open Source. </span>Earlier this year, we decided to take the first step and Open Source all of the ArrayFire library\'s  tertiary projects. This includes all of our ArrayFire library\'s language wrappers, examples, and source code used for our blog posts. All of our projects are hosted at <a href=\"https://github.com/arrayfire\">our GitHub page</a>.\r\n\r\nThese are some of the projects  you will find on our GitHub page:\r\n<ul>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\r\n</ul>\r\nAdditionally, some of our users have also created a GitHub page to host projects developed by our community. If you are an ArrayFire library user and have any projects you would like to share, please go to our <a href=\"https://github.com/arrayfire-community\">ArrayFire community</a> page and contribute!\r\n\r\nWe are working towards even bigger things in the future!','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-revision-v1','','','2014-05-15 20:52:44','2014-05-15 20:52:44','',5538,'http://sandbox.arrayfire.com/5538-revision-v1/',0,'revision','',0),(5573,17728,'2014-05-15 20:56:23','2014-05-15 20:56:23','<span style=\"line-height: 1.5em;\">At ArrayFire we like to use a lot of Free/Open Source software. We use various Linux distributions, </span><a style=\"line-height: 1.5em;\" href=\"http://jenkins-ci.org/\">Jenkins</a><span style=\"line-height: 1.5em;\">, </span><a style=\"line-height: 1.5em;\" href=\"https://www.gitlab.com/\">Gitlab</a><span style=\"line-height: 1.5em;\">, gcc, emacs, vim and numerous other <abbr title=\"Free Open Source Software\">FOSS</abbr> tools on a daily basis.</span>\r\n\r\n<span style=\"line-height: 1.5em;\">We also love the idea of developing software collaboratively and openly. Last year we started <a href=\"http://sandbox.arrayfire.com/clmath-an-open-source-blas-and-fft-library-for-opencl/\">working with AMD</a> on <a href=\"https://github.com/clMathLibraries/\">CL Math Libraries</a>. Internally we\'ve had numerous discussions about contributing to the <abbr title=\"General Purpose Graphrics Processing Unit\">GPGPU</abbr> community. However, it\'s neither simple nor straightforward to take a closed software Open Source. </span>Earlier this year, we decided to take the first step and Open Source all of the ArrayFire library\'s  tertiary projects. This includes all of our ArrayFire library\'s language wrappers, examples, and source code used for our blog posts. All of our projects are hosted at <a href=\"https://github.com/arrayfire\">our GitHub page</a>.\r\n\r\nThese are some of the projects  you will find on our GitHub page:\r\n<ul>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_fortran\">FORTRAN wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_r\">R wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_java\">JAVA wrapper for ArrayFire</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_examples\">All ArrayFire examples</a></li>\r\n	<li><a href=\"https://github.com/arrayfire/arrayfire_opengl_interop\">Using OpenGL with CUDA and ArrayFire</a></li>\r\n	<li><a title=\"Deploy CUDA\" href=\"https://github.com/arrayfire/cuda_deployment_tutorial\">Deploying CUDA on the cloud</a></li>\r\n</ul>\r\nAdditionally, some of our users have also created a GitHub page to host projects developed by our community. If you are an ArrayFire library user and have any projects you would like to share, please go to our <a href=\"https://github.com/arrayfire-community\">ArrayFire community</a> page and contribute!\r\n\r\nWe are working towards even bigger things in the future!','Open Source Initiatives from ArrayFire','','inherit','open','closed','','5538-revision-v1','','','2014-05-15 20:56:23','2014-05-15 20:56:23','',5538,'http://sandbox.arrayfire.com/5538-revision-v1/',0,'revision','',0),(5574,17729,'2014-05-20 15:31:57','2014-05-20 15:31:57','Mobile devices are carving their niche into the world of computing with more processing power day by day. GPUs on mobile devices have been around for a while, but using them for accelerating computation is still quite new. Until recently, the only way to access the GPU was through OpenGL. Around december 2008, Khronos released OpenCL, a generic API for accelerating non-graphics tasks. OpenCL enables us to take advantage of acceleration hardware. Since it is an open standard, many hardware vendors provide support on their devices. With the recent release of Adreno and Mali SDKs, you can now run OpenCL code on mobile GPUs.\r\n\r\nToday\'s post is going to be about how to do image processing on camera feed on Android devices using OpenCL. To successfully complete this tutorial, you need to have basic knowledge of how to write OpenCL kernels and native code for Android.\r\n<h3 id=\"opencl\">OpenCL</h3>\r\nTo use OpenCL on your mobile device\'s GPU, you must obtain the compatible libOpenCL.so library and the corresponding OpenCL headers.\r\n\r\nI initially thought I could just use the C++ OpenCL header available from Khronos website for development, however that didn\'t work. I faced compilation errors because of incompatible OpenGL headers. There are couple of ways to get the compatible headers. You can either use the <a href=\"https://github.com/arrayfire/androidcl/tree/master/jni/include\">headers</a> provided along with the example application or extract them from Adreno/Mali SDK. For Adreno SDK, you can find the headers at <code>&lt;Adreno_SDK&gt;/Development/Inc/CL</code>. For Mali SDK, you can find the headers at <code>&lt;MALI_SDK&gt;/include/CL</code>.\r\n\r\nFor newer devices such as Samsung Galaxy Note 3 and Samsung Galaxy S5, it is very likely the library is already present on the mobile device. My test device is a Note 3 for which i found the library under <code>/system/vendor/lib</code>. You can do <code>adb pull /system/vendor/lib/libOpenCL.so ./</code> to get the file to your desktop machine. In these kind of cases, you might be able to use the library out of the box without any issues. For any other scenario, please use the directions in following sections to get the library and make it work if available.\r\n<h4 id=\"adreno-gpu\">Adreno GPU</h4>\r\nIf you do not find the library on your device, check if your device has OpenCL support on the corresponding vendor\'s website. If your GPU does have OpenCL support, you might have to update your OS in order to get the recent updates. If you don\'t find the library even after OS update, you might want to email the vendor. However, if your GPU does not have OpenCL support, there isn\'t much we can do.\r\n\r\nIf you do find the library and can\'t use for some reason. Try to update your device drivers using the ones provided by Qualcomm. You can download them from <a href=\"https://developer.qualcomm.com/mobile-development/maximize-hardware/mobile-gaming-graphics-adreno/tools-and-resources\">here</a>. Ensure that you are downloading the Adreno driver but not the Adreno SDK. Follow the instructions in the package and update the drivers on your device. This should resolve any issues you have.\r\n<h4 id=\"mali-gpu\">Mali GPU</h4>\r\nDownload the SDK from <a href=\"http://malideveloper.arm.com/develop-for-mali/sdks/mali-opencl-sdk/\">here</a>. Follow the instructions in the package and build the shared library and copy it on to your device.\r\n<h4 id=\"kernels\">Kernels</h4>\r\nI needed to do two things to achieve my target.\r\n<ul>\r\n	<li>Convert frame data provided by Android camera from NV21 format to RGBA8888 format.</li>\r\n	<li>Run laplacian operator on the RGBA8888 image data.</li>\r\n</ul>\r\nGetting a grayscale image from NV21 format is cake walk, just read the first width*height bytes and you are done. As per the format of <a href=\"http://www.fourcc.org/yuv.php#NV21\">NV21</a>, for each 2x2 sub-matrix of pixels, there will be a pair (v,u). Since 4 pixels are reading same (v,u), i decided to use shared memory to reduce reading latency. The code below is the core of this conversion kernel, that is expected to speed up the conversion if compared to a pure C code.\r\n<pre>\r\n#define BLK_SIZE 16\r\n//prefix D for decoding\r\n#define DSHRD_LEN (BLK_SIZE/2)\r\n#define DSHRD_SIZE (2*DSHRD_LEN*DSHRD_LEN)\r\n// ...\r\n// ...\r\n// kernel signature\r\n{\r\n    __local uchar uvShrd[DSHRD_SIZE];\r\n    int gx = get_global_id(0);\r\n    int gy = get_global_id(1);\r\n    int lx = get_local_id(0);\r\n    int ly = get_local_id(1);\r\n    int off = im_width*im_height;\r\n    int inIdx= gy*im_width+gx;\r\n    int uvIdx= off + (gy/2)*im_width + (gx & ~1); // took me a while to figure out this formula\r\n    int shlx = lx/2;\r\n    int shly = ly/2;\r\n    int shIdx= 2*(shlx+shly*DSHRD_LEN);\r\n    if( gx%2==0 && gy%2==0 ) {\r\n        uvShrd[shIdx+0] = in[uvIdx+0];\r\n        uvShrd[shIdx+1] = in[uvIdx+1];\r\n    }\r\n    int y = (0xFF & ((int)in[inIdx]));\r\n    int y = (0xFF & ((int)in[inIdx]));\r\n    if( y < 16 ) y=16;\r\n    barrier(CLK_LOCAL_MEM_FENCE);\r\n    //..... rest of code that does color space conversion\r\n}\r\n</pre>\r\nLaplacian kernel is pretty straightforward, read all eight neighbors pixel values using shared memory and compute the convolution result. You can find kernels source code <a href=\"https://github.com/arrayfire/androidcl/blob/master/assets/kernels.cl\">here</a>.\r\n<h4 id=\"auxilary-code\">Auxilary Code</h4>\r\nThe JNI native function declarations can be seen in the file <a href=\"https://github.com/arrayfire/androidcl/blob/master/jni/processor.h\">processor.h</a>. I have included couple of extra Android related headers which are required to read bitmap files and print debug messages from JNI routines. The C-string pointed by macro <code>app_name</code> can be used to prune the output of the command <code>adb logcat</code> to get only messages that are associated with our JNI routines. To do that, you need to pass the value of <code>app_name</code> to adb command as an option as shown below.\r\n<pre>adb logcat -s \"JNIProcessor\"</pre>\r\nThis is quite useful when you are debugging problems that are related to accuracy of results.\r\n\r\nThe full source code for JNI native functions can be seen in the file <a href=\"https://github.com/arrayfire/androidcl/blob/master/jni/processor.cpp\">processor.cpp</a>. Following are brief descriptions of the Android/JNI functions I have used in this project.\r\n<ul>\r\n	<li><code>AndroidBitmap_getInfo</code> - provides details like width, height, stride, format.</li>\r\n	<li><code>AndroidBitmap_lockPixels</code> - gives us a pointer to the memory location of image data. Once lockPixels is called, it has to be followed by a unlockPixels at some point later in the code.</li>\r\n	<li><code>GetPrimitiveArrayCritical</code> - as the name suggets, this is some kind of performance critical call. Hence, we should take care that the code amid a GetPrimitiveArrayCritical call and the corresponding ReleasePrimitiveArrayCritical call doesn\'t stall execution for extended periods of time. As per <a href=\"http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html\">Oracle\'s Java documentation</a>, a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.</li>\r\n	<li><code>ReleasePrimitiveArrayCritical</code> - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.</li>\r\n	<li><code>AndroidBitmap_unlockPixels</code> - used to release memory space used by a previous lockPixels call.</li>\r\n</ul>\r\nListed below are some of the other auxilary functions that i needed to make the code look clean.\r\n<ul>\r\n	<li><code>throwJavaException</code> - convenience function used to throw Java exceptions from JNI routines.</li>\r\n	<li><code>cb</code> - callback function provided when OpenCL kernels are built. When you actually look at this, you might wonder why did i do this part alone using C-interface of OpenCL. I just wanted to try it out, hence it happened so.</li>\r\n	<li><code>Java_com_example_LiveFeatureActivity_compileKernels</code> - as you might have noticed, this is a JNI routine i used to compile the OpenCL kernels only once during the app start up.</li>\r\n</ul>\r\n<h3 id=\"build-on-linux\">Build (on Linux)</h3>\r\nAndroid-NDK provides a very useful tool <code>ndk-build</code> to build native code for Android.\r\n<ol>\r\n	<li>Clone the git repo <code>git clone https://github.com/arrayfire/androidcl</code></li>\r\n	<li><code>cd androidcl</code></li>\r\n	<li>Ensure android-ndk installed and environment variable <code>ANDROID_NDK</code> is pointing to ndk installation root.</li>\r\n	<li>Ensure environment variable <code>PATH</code> has the path <code>$ANDROID_NDK</code> appended to it.</li>\r\n	<li>Run <code>ndk-build</code> from project root.</li>\r\n	<li>If you have <code>eclipse</code> installed, then import the project from eclipse and build it as usually.</li>\r\n	<li>If you do not have eclipse or don\'t want to use it, then I assume you might already know about apache-ant tool. Run <code>ant debug</code></li>\r\n</ol>\r\n<h4 id=\"android.mk\">Android.mk</h4>\r\nThere are couple of things that you need to do to use OpenCL on Android apart from standard JNI makefile instructions.\r\n<ul>\r\n	<li>Ensure that you set <code>LOCAL_ARM_MODE</code> to <code>arm</code>, which enables you to build for 32-bit ARM architecture instead of the default 16-bit.</li>\r\n	<li>Ensure that the variable <code>LOCAL_CPPFLAGS</code> has been set to point to OpenCL headers.</li>\r\n	<li>Add <code>libOpenCL.so</code> dependency to <code>LOCAL_LDLIBS</code> variable.</li>\r\n</ul>\r\nClick <a href=\"https://github.com/arrayfire/androidcl/blob/master/jni/Android.mk\">here</a> to see full content of Android.mk.\r\n\r\nNote: In case you want a static library, replace <code>include $(BUILD_SHARED_LIBRARY)</code> with <code>include $(BUILD_STATIC_LIBRARY)</code>.\r\n<h4 id=\"application.mk\">Application.mk</h4>\r\nThis file is not mandatory, but you may need it in cases where you want specify your requirements about the system libraries you want to use in your application. In this project i have set <code>APP_STL</code> to <code>gnustl_static</code> to declare that i want to use the static version of gnustl. I have also set the Android API target version as 14 by setting <code>APP_PLATFORM</code> to <code>android-14</code>.\r\nClick <a href=\"https://github.com/arrayfire/androidcl/blob/master/jni/Application.mk\">here</a> to see full content of Application.mk.\r\n<h3 id=\"app-installation\">App Installation</h3>\r\n<h4 id=\"ant-users\">ant-users</h4>\r\nFor installing the app in your mobile device do <code>ant debug install</code>. Should you choose to remove it after you are done playing with it, just do <code>ant debug uninstall</code>.\r\n<h4 id=\"eclipse-users\">eclipse-users</h4>\r\nRight click the project in workspace and click the menu item \"Run As -&gt; Android Application\".\r\n\r\nYou can see below the video of the app running live.\r\n\r\n[video width=\"1280\" height=\"720\" mp4=\"http://sandbox.arrayfire.com/wp-content/uploads/2014/05/ocl_demo.mp4\"]Screen capture of the live app[/video]\r\n\r\n&nbsp;\r\n\r\nStay tuned for more exciting developments as we continue to add more examples of OpenCL on Andriod!','Getting Started with OpenCL on Android','','publish','open','closed','','getting-started-with-opencl-on-android','','','2014-05-25 23:36:42','2014-05-25 23:36:42','',0,'http://sandbox.arrayfire.com/?p=5574',0,'post','',10),(5575,17729,'2014-05-15 22:37:07','2014-05-15 22:37:07','Code\r\n====\r\nI used to use java (jython to be precise) when i used to work as WebSphere (Yes, an IBM product) administrator a really long time back. After such a long gap, i had to look into java again when i needed to do some native level programming for android app.\r\n\r\nMy final target was to do some image processing on camera feed. Out of habit (c/c++), i wanted to start with a header to declare the methods that i saw i would need later. Searching through google gave me couple of options on how to generate the required headers.\r\n\r\n* Use [javah](http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javah.html) and generate\r\n* Write them yourself\r\n\r\nI took the second route. After a bit of playing with the tedious naming convention for jni functions, i use the following macro to create my function declarations.\r\n```c\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n```\r\n\r\nAn example declaration of function that takes [NV21](http://www.fourcc.org/yuv.php#NV21) format data as input and writes output to bitmap will be as follows:\r\n```c\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n```\r\n\r\nI like it this way because it makes my header more readable than it will be if generated using javah. Once the headers are generated, i moved onto actual code.\r\n\r\nUnless you have multiple functions that share same number of input parameters and identical logic, it is hard to abstract the actual code using a macro. In anycase, i don\'t like macros with logic as it makes life hard to debug later. So, I had to write the full signature when implementing the function.\r\n```c\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\nJNIEnv *env,\r\njclass clazz,\r\njobject outBmp,\r\njByteArray inData,\r\njint width,\r\njint height)\r\n{\r\n// TODO: process the input and write the output\r\n}\r\n```\r\n\r\nWith appropriate inclusion of headers and putting together everything we have done so far, the header file and source file will look as below.\r\n\r\nprocessor.h\r\n-----------\r\n```c\r\n#ifndef __JNI_H__\r\n#define __JNI_H__\r\n#ifdef __cplusplus\r\n\r\n#include\r\n#include &lt;android/bitmap.h&gt; // This header will enable us to read bitmap objects\r\n#include &lt;android/log.h&gt; // This header will enable us to print messages from jni functions\r\n\r\n#define app_name \"JNIProcessor\"\r\n#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, app_name, __VA_ARGS__))\r\n#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, app_name, __VA_ARGS__))\r\n#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, app_name, __VA_ARGS__))\r\nextern \"C\" {\r\n#endif\r\n\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif //__JNI_H__\r\n```\r\nI have included couple of extra android related headers which are required to read bitmap files and print debug messages from jni routines. The c-string pointed by macro `app_name` can be used to prune the output of command `adb logcat` to get only the messages that are associated with our jni routines. All you would need to do is to pass on the value of `app_name` to adb as an option as shown below.\r\n```bash\r\nadb logcat -s \"JNIProcessor\"\r\n```\r\nThis is quite useful when you are debugging problems that are related to accuracy of results.\r\n\r\nNext comes the cpp file. I have added more skeleton code that is required to get to a stage when you have access to the image data. It includes some standard andoird NDK library calls:\r\n* `AndroidBitmap_getInfo` - used to get bitmap details like width, height, stride, format.\r\n* `AndroidBitmap_lockPixels` - used to get a pointer to the memory location of image data. Once a lockPixels is called, it has to be followed by a unlockPixels at some point later in the code. Probably creates a copy of original bitmap data which the jvm needs to free up when we are done using it.\r\n* `GetPrimitiveArrayCritical` - As the name suggets, this is some kind of performance critical call. Hence, we should take care of the code that runs between a Get and Release calls runs as fast as possible and doesn\'t stall execution. As per [Oracle\'s java documenatation](http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html), a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.\r\n* `ReleasePrimitiveArrayCritical` - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.\r\n* `AndroidBitmap_unlockPixels` - used to release memory space used by a previous lockPixels call.\r\n\r\nThere are couple of other functions that are not related to JNI.\r\n* `throwJavaException` - convenience function used to throw java exceptions from within jni routines.\r\n* `blur_helper` - helper function that converts nv21 format to rgba8888 and does blur operation on the converted data.\r\n\r\nprocessor.cpp\r\n-------------\r\n```c\r\n#include \"processor.h\"\r\n\r\n#include\r\n#include\r\n#include\r\n\r\nbool throwJavaException(JNIEnv *env,std::string method_name,std::string exception_msg, int errorCode=0)\r\n{\r\nchar buf[8];\r\nsprintf(buf,\"%d\",errorCode);\r\nstd::string code(buf);\r\n\r\nstd::string msg = \"@\" + method_name + \": \" + exception_msg + \" \";\r\nif(errorCode!=0) msg += code;\r\n\r\njclass generalExp = env-&gt;FindClass(\"java/lang/Exception\");\r\nif (generalExp != 0) {\r\nenv-&gt;ThrowNew(generalExp, msg.c_str());\r\nreturn true;\r\n}\r\nreturn false;\r\n}\r\n\r\nvoid blur_helper(uint32_t* out, int osize, uint8_t* in, int isize, int w, int h)\r\n{\r\nuint32_t* tmp = new uint32_t[osize];\r\nconvertNV21toRGBA8888(tmp,in,w,h);\r\ngblur(out,tmp,w,h);\r\ndelete[] tmp;\r\n}\r\n\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\nJNIEnv *env,\r\njclass clazz,\r\njobject outBmp,\r\njByteArray inData,\r\njint width,\r\njint height)\r\n{\r\nint outsz = width*height;\r\nint insz = outsz + outsz/2;\r\nAndroidBitmapInfo bmpInfo;\r\nif (AndroidBitmap_getInfo(env, outBmp, &amp;bmpInfo) &lt; 0) {\r\nthrowJavaException(env,\"gaussianBlur\",\"Error retrieving bitmap meta data\");\r\nreturn;\r\n}\r\nif (bmpInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {\r\nthrowJavaException(env,\"gaussianBlur\",\"Expecting RGBA_8888 format\");\r\nreturn;\r\n}\r\nuint32_t* bmpContent;\r\nif (AndroidBitmap_lockPixels(env, outBmp,(void**)&amp;bmpContent) &lt; 0) { throwJavaException(env,\"gaussianBlur\",\"Unable to lock bitmap pixels\"); return; } jbyte* inPtr = (jbyte*)env-&gt;GetPrimitiveArrayCritical(inData, 0);\r\nif (inPtr == NULL) {\r\nthrowJavaException(env,\"gaussianBlur\",\"NV21 byte stream getPointer returned NULL\");\r\nreturn;\r\n}\r\n\r\nblur_helper(bmpContent,outsz,inPtr,insz,width,height);\r\n\r\n// This is absolutely neccessary before calling any other JNI function\r\nenv-&gt;ReleasePrimitiveArrayCritical(inData,inPtr,0);\r\nAndroidBitmap_unlockPixels(env, outBmp);\r\n}\r\n```\r\nA navie implementation of gaussian blur for function `gblur` can be done very easily using a for loop.\r\n\r\nI will cover the function `convertNV21toRGBA8888` in a future post. Will try to do two versions\r\n* pure c method\r\n* opencl kernel for Snapdragon mobile device\r\n\r\nBuild (for Linux)\r\n=================\r\nblah blah blah, i can\'t use raw code!. Lets build it. Android-ndk provides a very useful tool `ndk-build`. We need to setup some stuff to run the build command `ndk-build`.\r\n\r\n0. Do `mkdir -p ~/jni_droid_test` OR Go to root folder of your android application.\r\n1. Ensure android-ndk installed and environment variable `ANDROID_NDK` is pointing to ndk installation root.\r\n2. Ensure environment variable `PATH` has the path `$ANDROID_NDK` appened to it.\r\n3. Do `mkdir -p ~/jni_droid_test/jni`\r\n4. Do `touch Android.mk and Application.mk` and prepare the content of the files as directed below.\r\n5. Do `ndk-build` from `~/jni_droid_test`\r\n\r\nAndroid.mk\r\n----------\r\n```bash\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_MODULE := JNIProcessor\r\nLOCAL_ARM_MODE := arm\r\nLOCAL_SRC_FILES := processor.cpp\r\nLOCAL_CPPFLAGS := -fexceptions\r\nLOCAL_LDLIBS := -ljnigraphics -llog\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n```\r\n`LOCAL_MODULE := JNIProcessor` sets the name of the shared library we are going to build. `LOCAL_ARM_MODE := arm` declares that library should be built for 32-bit ARM architecture instead of the 16-bit default. `LOCAL_SRC_FILES` variables should point to all the source files we want to compile, in our case processor.cpp. `LOCAL_CPPFLAGS` declares that we would be using c++ exceptions in our code. The flags `-ljnigraphics`, `--llog` are used for accessing bitmap, print functions respectively. Finally, the line `include $(BUILD_SHARED_LIBRARY)` that says we want a shared library. In case you want a static version, do the following `include $(BUILD_STATIC_LIBRARY)`\r\n\r\nApplication.mk\r\n--------------\r\n```bash\r\nAPP_OPTIM := release\r\nAPP_STL := gnustl_static\r\nAPP_PLATFORM:= android-14\r\n```\r\n`APP_STL` is used to state that the library we are going to build will require static version of GNU STL. `APP_PLATFORM` should be your target-platorm. `APP_OPTIM` declares that this is a release version of the library. Should you need a debug version, just do `APP_OPTIM := debug`.\r\n\r\nUse the shared library\r\n======================\r\nNow, all you need to do to use the function would be load the library when java class is loaded by JVM and declare the gaussianBlur function as member of the corresponding class. For example, say we have a java class shown as below\r\n```java\r\npackage com.example;\r\n\r\npublic class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {\r\nstatic {\r\nSystem.loadLibrary(\"JNIProcessor\");\r\n}\r\nprivate void gaussianBlur(Bitmap out, byte[] in, int width, int height);\r\n\r\nprivate Bitmap mTexture;\r\nprivate int width, height;\r\n\r\n////TODO: constructors (setup configuration of mTexture like width and height)\r\n////TODO: Code for surfaceCreated(), surfaceChanged(), surfaceDestroyed()\r\n\r\npublic void onPreviewFrame(byte[] data, Camera camera) {\r\ngaussianBlur(mTexture,data,width,height);\r\ninvalidate();\r\n}\r\n\r\n////TODO: Code onDraw() method that can draw the processed bitmap on to canvas\r\n}\r\n```','Working with JNI for Android','','inherit','open','closed','','5574-revision-v1','','','2014-05-15 22:37:07','2014-05-15 22:37:07','',5574,'http://sandbox.arrayfire.com/5574-revision-v1/',0,'revision','',0),(5576,17729,'2014-05-15 22:41:30','2014-05-15 22:41:30','Code\r\n====\r\nI used to use java (jython to be precise) when i used to work as WebSphere (Yes, an IBM product) administrator a really long time back. After such a long gap, i had to look into java again when i needed to do some native level programming for android app.\r\n\r\nMy final target was to do some image processing on camera feed. Out of habit (c/c++), i wanted to start with a header to declare the methods that i saw i would need later. Searching through google gave me couple of options on how to generate the required headers.\r\n<ul>\r\n	<li>Use <a href=\"http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javah.html\">javah</href> and generate</li>\r\n	<li>Write them yourself</li>\r\n</ul>\r\nI took the second route. After a bit of playing with the tedious naming convention for jni functions, i use the following macro to create my function declarations.\r\n```c\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n```\r\n\r\nAn example declaration of function that takes [NV21](http://www.fourcc.org/yuv.php#NV21) format data as input and writes output to bitmap will be as follows:\r\n```c\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n```\r\n\r\nI like it this way because it makes my header more readable than it will be if generated using javah. Once the headers are generated, i moved onto actual code.\r\n\r\nUnless you have multiple functions that share same number of input parameters and identical logic, it is hard to abstract the actual code using a macro. In anycase, i don\'t like macros with logic as it makes life hard to debug later. So, I had to write the full signature when implementing the function.\r\n```c\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\nJNIEnv *env,\r\njclass clazz,\r\njobject outBmp,\r\njByteArray inData,\r\njint width,\r\njint height)\r\n{\r\n// TODO: process the input and write the output\r\n}\r\n```\r\n\r\nWith appropriate inclusion of headers and putting together everything we have done so far, the header file and source file will look as below.\r\n\r\nprocessor.h\r\n-----------\r\n```c\r\n#ifndef __JNI_H__\r\n#define __JNI_H__\r\n#ifdef __cplusplus\r\n\r\n#include\r\n#include &lt;android/bitmap.h&gt; // This header will enable us to read bitmap objects\r\n#include &lt;android/log.h&gt; // This header will enable us to print messages from jni functions\r\n\r\n#define app_name \"JNIProcessor\"\r\n#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, app_name, __VA_ARGS__))\r\n#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, app_name, __VA_ARGS__))\r\n#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, app_name, __VA_ARGS__))\r\nextern \"C\" {\r\n#endif\r\n\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif //__JNI_H__\r\n```\r\nI have included couple of extra android related headers which are required to read bitmap files and print debug messages from jni routines. The c-string pointed by macro `app_name` can be used to prune the output of command `adb logcat` to get only the messages that are associated with our jni routines. All you would need to do is to pass on the value of `app_name` to adb as an option as shown below.\r\n```bash\r\nadb logcat -s \"JNIProcessor\"\r\n```\r\nThis is quite useful when you are debugging problems that are related to accuracy of results.\r\n\r\nNext comes the cpp file. I have added more skeleton code that is required to get to a stage when you have access to the image data. It includes some standard andoird NDK library calls:\r\n* `AndroidBitmap_getInfo` - used to get bitmap details like width, height, stride, format.\r\n* `AndroidBitmap_lockPixels` - used to get a pointer to the memory location of image data. Once a lockPixels is called, it has to be followed by a unlockPixels at some point later in the code. Probably creates a copy of original bitmap data which the jvm needs to free up when we are done using it.\r\n* `GetPrimitiveArrayCritical` - As the name suggets, this is some kind of performance critical call. Hence, we should take care of the code that runs between a Get and Release calls runs as fast as possible and doesn\'t stall execution. As per [Oracle\'s java documenatation](http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html), a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.\r\n* `ReleasePrimitiveArrayCritical` - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.\r\n* `AndroidBitmap_unlockPixels` - used to release memory space used by a previous lockPixels call.\r\n\r\nThere are couple of other functions that are not related to JNI.\r\n* `throwJavaException` - convenience function used to throw java exceptions from within jni routines.\r\n* `blur_helper` - helper function that converts nv21 format to rgba8888 and does blur operation on the converted data.\r\n\r\nprocessor.cpp\r\n-------------\r\n```c\r\n#include \"processor.h\"\r\n\r\n#include\r\n#include\r\n#include\r\n\r\nbool throwJavaException(JNIEnv *env,std::string method_name,std::string exception_msg, int errorCode=0)\r\n{\r\nchar buf[8];\r\nsprintf(buf,\"%d\",errorCode);\r\nstd::string code(buf);\r\n\r\nstd::string msg = \"@\" + method_name + \": \" + exception_msg + \" \";\r\nif(errorCode!=0) msg += code;\r\n\r\njclass generalExp = env-&gt;FindClass(\"java/lang/Exception\");\r\nif (generalExp != 0) {\r\nenv-&gt;ThrowNew(generalExp, msg.c_str());\r\nreturn true;\r\n}\r\nreturn false;\r\n}\r\n\r\nvoid blur_helper(uint32_t* out, int osize, uint8_t* in, int isize, int w, int h)\r\n{\r\nuint32_t* tmp = new uint32_t[osize];\r\nconvertNV21toRGBA8888(tmp,in,w,h);\r\ngblur(out,tmp,w,h);\r\ndelete[] tmp;\r\n}\r\n\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\nJNIEnv *env,\r\njclass clazz,\r\njobject outBmp,\r\njByteArray inData,\r\njint width,\r\njint height)\r\n{\r\nint outsz = width*height;\r\nint insz = outsz + outsz/2;\r\nAndroidBitmapInfo bmpInfo;\r\nif (AndroidBitmap_getInfo(env, outBmp, &amp;bmpInfo) &lt; 0) {\r\nthrowJavaException(env,\"gaussianBlur\",\"Error retrieving bitmap meta data\");\r\nreturn;\r\n}\r\nif (bmpInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {\r\nthrowJavaException(env,\"gaussianBlur\",\"Expecting RGBA_8888 format\");\r\nreturn;\r\n}\r\nuint32_t* bmpContent;\r\nif (AndroidBitmap_lockPixels(env, outBmp,(void**)&amp;bmpContent) &lt; 0) { throwJavaException(env,\"gaussianBlur\",\"Unable to lock bitmap pixels\"); return; } jbyte* inPtr = (jbyte*)env-&gt;GetPrimitiveArrayCritical(inData, 0);\r\nif (inPtr == NULL) {\r\nthrowJavaException(env,\"gaussianBlur\",\"NV21 byte stream getPointer returned NULL\");\r\nreturn;\r\n}\r\n\r\nblur_helper(bmpContent,outsz,inPtr,insz,width,height);\r\n\r\n// This is absolutely neccessary before calling any other JNI function\r\nenv-&gt;ReleasePrimitiveArrayCritical(inData,inPtr,0);\r\nAndroidBitmap_unlockPixels(env, outBmp);\r\n}\r\n```\r\nA navie implementation of gaussian blur for function `gblur` can be done very easily using a for loop.\r\n\r\nI will cover the function `convertNV21toRGBA8888` in a future post. Will try to do two versions\r\n* pure c method\r\n* opencl kernel for Snapdragon mobile device\r\n\r\nBuild (for Linux)\r\n=================\r\nblah blah blah, i can\'t use raw code!. Lets build it. Android-ndk provides a very useful tool `ndk-build`. We need to setup some stuff to run the build command `ndk-build`.\r\n\r\n0. Do `mkdir -p ~/jni_droid_test` OR Go to root folder of your android application.\r\n1. Ensure android-ndk installed and environment variable `ANDROID_NDK` is pointing to ndk installation root.\r\n2. Ensure environment variable `PATH` has the path `$ANDROID_NDK` appened to it.\r\n3. Do `mkdir -p ~/jni_droid_test/jni`\r\n4. Do `touch Android.mk and Application.mk` and prepare the content of the files as directed below.\r\n5. Do `ndk-build` from `~/jni_droid_test`\r\n\r\nAndroid.mk\r\n----------\r\n```bash\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_MODULE := JNIProcessor\r\nLOCAL_ARM_MODE := arm\r\nLOCAL_SRC_FILES := processor.cpp\r\nLOCAL_CPPFLAGS := -fexceptions\r\nLOCAL_LDLIBS := -ljnigraphics -llog\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n```\r\n`LOCAL_MODULE := JNIProcessor` sets the name of the shared library we are going to build. `LOCAL_ARM_MODE := arm` declares that library should be built for 32-bit ARM architecture instead of the 16-bit default. `LOCAL_SRC_FILES` variables should point to all the source files we want to compile, in our case processor.cpp. `LOCAL_CPPFLAGS` declares that we would be using c++ exceptions in our code. The flags `-ljnigraphics`, `--llog` are used for accessing bitmap, print functions respectively. Finally, the line `include $(BUILD_SHARED_LIBRARY)` that says we want a shared library. In case you want a static version, do the following `include $(BUILD_STATIC_LIBRARY)`\r\n\r\nApplication.mk\r\n--------------\r\n```bash\r\nAPP_OPTIM := release\r\nAPP_STL := gnustl_static\r\nAPP_PLATFORM:= android-14\r\n```\r\n`APP_STL` is used to state that the library we are going to build will require static version of GNU STL. `APP_PLATFORM` should be your target-platorm. `APP_OPTIM` declares that this is a release version of the library. Should you need a debug version, just do `APP_OPTIM := debug`.\r\n\r\nUse the shared library\r\n======================\r\nNow, all you need to do to use the function would be load the library when java class is loaded by JVM and declare the gaussianBlur function as member of the corresponding class. For example, say we have a java class shown as below\r\n```java\r\npackage com.example;\r\n\r\npublic class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {\r\nstatic {\r\nSystem.loadLibrary(\"JNIProcessor\");\r\n}\r\nprivate void gaussianBlur(Bitmap out, byte[] in, int width, int height);\r\n\r\nprivate Bitmap mTexture;\r\nprivate int width, height;\r\n\r\n////TODO: constructors (setup configuration of mTexture like width and height)\r\n////TODO: Code for surfaceCreated(), surfaceChanged(), surfaceDestroyed()\r\n\r\npublic void onPreviewFrame(byte[] data, Camera camera) {\r\ngaussianBlur(mTexture,data,width,height);\r\ninvalidate();\r\n}\r\n\r\n////TODO: Code onDraw() method that can draw the processed bitmap on to canvas\r\n}\r\n```','Working with JNI for Android','','inherit','open','closed','','5574-revision-v1','','','2014-05-15 22:41:30','2014-05-15 22:41:30','',5574,'http://sandbox.arrayfire.com/5574-revision-v1/',0,'revision','',0),(5577,17729,'2014-05-15 23:02:29','2014-05-15 23:02:29','<h2>Code</h2>\r\nI used to use java (jython to be precise) when i used to work as WebSphere (Yes, an IBM product) administrator a really long time back. After such a long gap, i had to look into java again when i needed to do some native level programming for android app.\r\n\r\nMy final target was to do some image processing on camera feed. Out of habit (c/c++), i wanted to start with a header to declare the methods that i saw i would need later. Searching through google gave me couple of options on how to generate the required headers.\r\n<ul>\r\n	<li>Use <a href=\"http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javah.html\">javah</a> and generate</li>\r\n	<li>Write them yourself</li>\r\n</ul>\r\nI took the second route. After a bit of playing with the tedious naming convention for jni functions, i use the following macro to create my function declarations.\r\n<code>\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n</code>\r\n\r\nAn example declaration of function that takes <a href=\"http://www.fourcc.org/yuv.php#NV21\">NV21</a> format data as input and writes output to bitmap will be as follows:\r\n<code>\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n</code>\r\n\r\nI like it this way because it makes my header more readable than it will be if generated using javah. Once the headers are generated, i moved onto actual code.\r\n\r\nUnless you have multiple functions that share same number of input parameters and identical logic, it is hard to abstract the actual code using a macro. In anycase, i don\'t like macros with logic as it makes life hard to debug later. So, I had to write the full signature when implementing the function.\r\n<code>\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\nJNIEnv *env,\r\njclass clazz,\r\njobject outBmp,\r\njByteArray inData,\r\njint width,\r\njint height)\r\n{\r\n// TODO: process the input and write the output\r\n}\r\n</code>\r\n\r\nWith appropriate inclusion of headers and putting together everything we have done so far, the header file and source file will look as below.\r\n\r\nClick processor.h to see the full source code for function declarations. I have included couple of extra android related headers which are required to read bitmap files and print debug messages from jni routines. The c-string pointed by macro <em>app_name</em> can be used to prune the output of command <em>adb logcat</em> to get only the messages that are associated with our jni routines. All you would need to do is to pass on the value of <em>app_name</em> to adb as an option as shown below. It is quite useful when you are debugging problems that are related to accuracy of results.\r\n<code>\r\nadb logcat -s \"JNIProcessor\"\r\n</code>\r\n\r\nNext comes the cpp file. I have added more skeleton code that is required to get to a stage when you have access to the image data. It includes some standard andoird NDK library calls:\r\n<ul>\r\n	<li><em>AndroidBitmap_getInfo</em> - used to get bitmap details like width, height, stride, format.</li>\r\n	<li><em>AndroidBitmap_lockPixels</em> - used to get a pointer to the memory location of image data. Once a lockPixels is called, it has to be followed by a unlockPixels at some point later in the code. Probably creates a copy of original bitmap data which the jvm needs to free up when we are done using it.</li>\r\n	<li><em>GetPrimitiveArrayCritical</em> - As the name suggets, this is some kind of performance critical call. Hence, we should take care of the code that runs between a Get and Release calls runs as fast as possible and doesn\'t stall execution. As per [Oracle\'s java documenatation](http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html), a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.</li>\r\n	<li><em>ReleasePrimitiveArrayCritical</em> - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.</li>\r\n	<li><em>AndroidBitmap_unlockPixels</em> - used to release memory space used by a previous lockPixels call.</li>\r\n</ul>\r\nThere are couple of other functions that are not related to JNI.\r\n<ul>\r\n	<li><em>throwJavaExceptio</em> - convenience function used to throw java exceptions from within jni routines.</li>\r\n	<li><em>blur_helper</em> - helper function that converts nv21 format to rgba8888 and does blur operation on the converted data.</li>\r\n</ul>\r\nClick processor.cpp to see the full source code for function implementations. A navie implementation of gaussian blur for function <em>gblur</em> can be done very easily using a for loop.\r\n\r\nI will cover the function <em>convertNV21toRGBA8888</em> in a future post. Will try to do two versions\r\n<ul>\r\n	<li>pure c method</li>\r\n	<li>opencl kernel for Snapdragon mobile device</li>\r\n</ul>\r\n<h2>Build (for Linux)</h2>\r\nblah blah blah, i can\'t use raw code!. Lets build it. Android-ndk provides a very useful tool ndk-build. We need to setup some stuff to run the build command <em>ndk-build</em>.\r\n<ol>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test</em> OR Go to root folder of your android application</li>\r\n	<li>Ensure android-ndk installed and environment variable <em>ANDROID_NDK</em> is pointing to ndk installation root</li>\r\n	<li>Ensure environment variable <em>PATH</em> has the path <em>$ANDROID_NDK</em> appened to it</li>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test/jni</em></li>\r\n	<li>Do <em>touch Android.mk and Application.mk</em> and prepare the content of the files as directed below</li>\r\n	<li>Do <em>ndk-build</em> from <em>~/jni_droid_test</em></li>\r\n</ol>\r\n<h3>Android.mk</h3>\r\n<code>\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_MODULE := JNIProcessor\r\nLOCAL_ARM_MODE := arm\r\nLOCAL_SRC_FILES := processor.cpp\r\nLOCAL_CPPFLAGS := -fexceptions\r\nLOCAL_LDLIBS := -ljnigraphics -llog\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n</code>\r\n<em>LOCAL_MODULE := JNIProcessor</em> sets the name of the shared library we are going to build. <em>LOCAL_ARM_MODE := arm</em> declares that library should be built for 32-bit ARM architecture instead of the 16-bit default. <em>LOCAL_SRC_FILES</em> variables should point to all the source files we want to compile, in our case processor.cpp. <em>LOCAL_CPPFLAGS</em> declares that we would be using c++ exceptions in our code. The flags <em>-ljnigraphics</em>, <em>--llog</em> are used for accessing bitmap, print functions respectively. Finally, the line <em>include $(BUILD_SHARED_LIBRARY)</em> that says we want a shared library. In case you want a static version, do the following <em>include $(BUILD_STATIC_LIBRARY)</em>\r\n<h3>Application.mk</h3>\r\n<code>\r\nAPP_OPTIM := release\r\nAPP_STL := gnustl_static\r\nAPP_PLATFORM:= android-14\r\n</code>\r\n\r\n<em>APP_STL</em> is used to state that the library we are going to build will require static version of GNU STL. <em>APP_PLATFORM</em> should be your target-platorm. <em>APP_OPTIM</em> declares that this is a release version of the library. Should you need a debug version, just do <em>APP_OPTIM := debug</em>.\r\n<h2>Use the shared library</h2>\r\nNow, all you need to do to use the function would be load the library when java class is loaded by JVM and declare the gaussianBlur function as member of the corresponding class. For example, say we have a java class shown as below\r\n\r\n<code>\r\npackage com.example;\r\npublic class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {\r\nstatic {\r\nSystem.loadLibrary(\"JNIProcessor\");\r\n}\r\nprivate void gaussianBlur(Bitmap out, byte[] in, int width, int height);\r\n\r\nprivate Bitmap mTexture;\r\nprivate int width, height;\r\n\r\n////TODO: constructors (setup configuration of mTexture like width and height)\r\n////TODO: Code for surfaceCreated(), surfaceChanged(), surfaceDestroyed()\r\n\r\npublic void onPreviewFrame(byte[] data, Camera camera) {\r\ngaussianBlur(mTexture,data,width,height);\r\ninvalidate();\r\n}\r\n\r\n////TODO: Code onDraw() method that can draw the processed bitmap on to canvas\r\n}\r\n</code>','Working with JNI for Android','','inherit','open','closed','','5574-revision-v1','','','2014-05-15 23:02:29','2014-05-15 23:02:29','',5574,'http://sandbox.arrayfire.com/5574-revision-v1/',0,'revision','',0),(5578,17729,'2014-05-15 23:03:41','2014-05-15 23:03:41','<h2>Code</h2>\r\nI used to use java (jython to be precise) when i used to work as WebSphere (Yes, an IBM product) administrator a really long time back. After such a long gap, i had to look into java again when i needed to do some native level programming for android app.\r\n\r\nMy final target was to do some image processing on camera feed. Out of habit (c/c++), i wanted to start with a header to declare the methods that i saw i would need later. Searching through google gave me couple of options on how to generate the required headers.\r\n<ul>\r\n	<li>Use <a href=\"http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javah.html\">javah</a> and generate</li>\r\n	<li>Write them yourself</li>\r\n</ul>\r\nI took the second route. After a bit of playing with the tedious naming convention for jni functions, i use the following macro to create my function declarations.\r\n<code>\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n</code>\r\n\r\nAn example declaration of function that takes <a href=\"http://www.fourcc.org/yuv.php#NV21\">NV21</a> format data as input and writes output to bitmap will be as follows:\r\n<code>\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n</code>\r\n\r\nI like it this way because it makes my header more readable than it will be if generated using javah. Once the headers are generated, i moved onto actual code.\r\n\r\nUnless you have multiple functions that share same number of input parameters and identical logic, it is hard to abstract the actual code using a macro. In anycase, i don\'t like macros with logic as it makes life hard to debug later. So, I had to write the full signature when implementing the function.\r\n<code>\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\nJNIEnv *env,\r\njclass clazz,\r\njobject outBmp,\r\njByteArray inData,\r\njint width,\r\njint height)\r\n{\r\n// TODO: process the input and write the output\r\n}\r\n</code>\r\n\r\nWith appropriate inclusion of headers and putting together everything we have done so far, the header file and source file will look as below.\r\n\r\nClick processor.h to see the full source code for function declarations. I have included couple of extra android related headers which are required to read bitmap files and print debug messages from jni routines. The c-string pointed by macro <em>app_name</em> can be used to prune the output of command <em>adb logcat</em> to get only the messages that are associated with our jni routines. All you would need to do is to pass on the value of <em>app_name</em> to adb as an option as shown below. It is quite useful when you are debugging problems that are related to accuracy of results.\r\n<code>\r\nadb logcat -s \"JNIProcessor\"\r\n</code>\r\n\r\nNext comes the cpp file. I have added more skeleton code that is required to get to a stage when you have access to the image data. It includes some standard andoird NDK library calls:\r\n<ul>\r\n	<li><em>AndroidBitmap_getInfo</em> - used to get bitmap details like width, height, stride, format.</li>\r\n	<li><em>AndroidBitmap_lockPixels</em> - used to get a pointer to the memory location of image data. Once a lockPixels is called, it has to be followed by a unlockPixels at some point later in the code. Probably creates a copy of original bitmap data which the jvm needs to free up when we are done using it.</li>\r\n	<li><em>GetPrimitiveArrayCritical</em> - As the name suggets, this is some kind of performance critical call. Hence, we should take care of the code that runs between a Get and Release calls runs as fast as possible and doesn\'t stall execution. As per [Oracle\'s java documenatation](http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html), a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.</li>\r\n	<li><em>ReleasePrimitiveArrayCritical</em> - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.</li>\r\n	<li><em>AndroidBitmap_unlockPixels</em> - used to release memory space used by a previous lockPixels call.</li>\r\n</ul>\r\nThere are couple of other functions that are not related to JNI.\r\n<ul>\r\n	<li><em>throwJavaExceptio</em> - convenience function used to throw java exceptions from within jni routines.</li>\r\n	<li><em>blur_helper</em> - helper function that converts nv21 format to rgba8888 and does blur operation on the converted data.</li>\r\n</ul>\r\nClick processor.cpp to see the full source code for function implementations. A navie implementation of gaussian blur for function <em>gblur</em> can be done very easily using a for loop.\r\n\r\nI will cover the function <em>convertNV21toRGBA8888</em> in a future post. Will try to do two versions\r\n<ul>\r\n	<li>pure c method</li>\r\n	<li>opencl kernel for Snapdragon mobile device</li>\r\n</ul>\r\n<h2>Build (for Linux)</h2>\r\nblah blah blah, i can\'t use raw code!. Lets build it. Android-ndk provides a very useful tool ndk-build. We need to setup some stuff to run the build command <em>ndk-build</em>.\r\n<ol>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test</em> OR Go to root folder of your android application</li>\r\n	<li>Ensure android-ndk installed and environment variable <em>ANDROID_NDK</em> is pointing to ndk installation root</li>\r\n	<li>Ensure environment variable <em>PATH</em> has the path <em>$ANDROID_NDK</em> appened to it</li>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test/jni</em></li>\r\n	<li>Do <em>touch Android.mk and Application.mk</em> and prepare the content of the files as directed below</li>\r\n	<li>Do <em>ndk-build</em> from <em>~/jni_droid_test</em></li>\r\n</ol>\r\n<h3>Android.mk</h3>\r\n<code>\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_MODULE := JNIProcessor\r\nLOCAL_ARM_MODE := arm\r\nLOCAL_SRC_FILES := processor.cpp\r\nLOCAL_CPPFLAGS := -fexceptions\r\nLOCAL_LDLIBS := -ljnigraphics -llog\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n</code>\r\n<em>LOCAL_MODULE := JNIProcessor</em> sets the name of the shared library we are going to build. <em>LOCAL_ARM_MODE := arm</em> declares that library should be built for 32-bit ARM architecture instead of the 16-bit default. <em>LOCAL_SRC_FILES</em> variables should point to all the source files we want to compile, in our case processor.cpp. <em>LOCAL_CPPFLAGS</em> declares that we would be using c++ exceptions in our code. The flags <em>-ljnigraphics</em>, <em>--llog</em> are used for accessing bitmap, print functions respectively. Finally, the line <em>include $(BUILD_SHARED_LIBRARY)</em> that says we want a shared library. In case you want a static version, do the following <em>include $(BUILD_STATIC_LIBRARY)</em>\r\n<h3>Application.mk</h3>\r\n<code>\r\nAPP_OPTIM := release\r\nAPP_STL := gnustl_static\r\nAPP_PLATFORM:= android-14\r\n</code>\r\n\r\n<em>APP_STL</em> is used to state that the library we are going to build will require static version of GNU STL. <em>APP_PLATFORM</em> should be your target-platorm. <em>APP_OPTIM</em> declares that this is a release version of the library. Should you need a debug version, just do <em>APP_OPTIM := debug</em>.\r\n<h2>Use the shared library</h2>\r\nNow, all you need to do to use the function would be load the library when java class is loaded by JVM and declare the gaussianBlur function as member of the corresponding class. For example, say we have a java class shown as below\r\n\r\n<code>\r\npackage com.example;\r\npublic class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {\r\n    static {\r\n        System.loadLibrary(\"JNIProcessor\");\r\n    }\r\n    private void gaussianBlur(Bitmap out, byte[] in, int width, int height);\r\n    private Bitmap mTexture;\r\n    private int width, height;\r\n    ////TODO: constructors (setup configuration of mTexture like width and height)\r\n    ////TODO: Code for surfaceCreated(), surfaceChanged(), surfaceDestroyed()\r\n    public void onPreviewFrame(byte[] data, Camera camera) {\r\n    gaussianBlur(mTexture,data,width,height);\r\n    invalidate();\r\n    }\r\n    ////TODO: Code onDraw() method that can draw the processed bitmap on to canvas\r\n}\r\n</code>','Working with JNI for Android','','inherit','open','closed','','5574-revision-v1','','','2014-05-15 23:03:41','2014-05-15 23:03:41','',5574,'http://sandbox.arrayfire.com/5574-revision-v1/',0,'revision','',0),(5579,17729,'2014-05-15 23:04:38','2014-05-15 23:04:38','<h2>Code</h2>\r\nI used to use java (jython to be precise) when i used to work as WebSphere (Yes, an IBM product) administrator a really long time back. After such a long gap, i had to look into java again when i needed to do some native level programming for android app.\r\n\r\nMy final target was to do some image processing on camera feed. Out of habit (c/c++), i wanted to start with a header to declare the methods that i saw i would need later. Searching through google gave me couple of options on how to generate the required headers.\r\n<ul>\r\n	<li>Use <a href=\"http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javah.html\">javah</a> and generate</li>\r\n	<li>Write them yourself</li>\r\n</ul>\r\nI took the second route. After a bit of playing with the tedious naming convention for jni functions, i use the following macro to create my function declarations.\r\n<code>\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n</code>\r\n\r\nAn example declaration of function that takes <a href=\"http://www.fourcc.org/yuv.php#NV21\">NV21</a> format data as input and writes output to bitmap will be as follows:\r\n<code>\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n</code>\r\n\r\nI like it this way because it makes my header more readable than it will be if generated using javah. Once the headers are generated, i moved onto actual code.\r\n\r\nUnless you have multiple functions that share same number of input parameters and identical logic, it is hard to abstract the actual code using a macro. In anycase, i don\'t like macros with logic as it makes life hard to debug later. So, I had to write the full signature when implementing the function.\r\n<code>\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\nJNIEnv *env,\r\njclass clazz,\r\njobject outBmp,\r\njByteArray inData,\r\njint width,\r\njint height)\r\n{\r\n// TODO: process the input and write the output\r\n}\r\n</code>\r\n\r\nWith appropriate inclusion of headers and putting together everything we have done so far, the header file and source file will look as below.\r\n\r\nClick processor.h to see the full source code for function declarations. I have included couple of extra android related headers which are required to read bitmap files and print debug messages from jni routines. The c-string pointed by macro <em>app_name</em> can be used to prune the output of command <em>adb logcat</em> to get only the messages that are associated with our jni routines. All you would need to do is to pass on the value of <em>app_name</em> to adb as an option as shown below. It is quite useful when you are debugging problems that are related to accuracy of results.\r\n<code>\r\nadb logcat -s \"JNIProcessor\"\r\n</code>\r\n\r\nNext comes the cpp file. I have added more skeleton code that is required to get to a stage when you have access to the image data. It includes some standard andoird NDK library calls:\r\n<ul>\r\n	<li><em>AndroidBitmap_getInfo</em> - used to get bitmap details like width, height, stride, format.</li>\r\n	<li><em>AndroidBitmap_lockPixels</em> - used to get a pointer to the memory location of image data. Once a lockPixels is called, it has to be followed by a unlockPixels at some point later in the code. Probably creates a copy of original bitmap data which the jvm needs to free up when we are done using it.</li>\r\n	<li><em>GetPrimitiveArrayCritical</em> - As the name suggets, this is some kind of performance critical call. Hence, we should take care of the code that runs between a Get and Release calls runs as fast as possible and doesn\'t stall execution. As per [Oracle\'s java documenatation](http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html), a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.</li>\r\n	<li><em>ReleasePrimitiveArrayCritical</em> - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.</li>\r\n	<li><em>AndroidBitmap_unlockPixels</em> - used to release memory space used by a previous lockPixels call.</li>\r\n</ul>\r\nThere are couple of other functions that are not related to JNI.\r\n<ul>\r\n	<li><em>throwJavaExceptio</em> - convenience function used to throw java exceptions from within jni routines.</li>\r\n	<li><em>blur_helper</em> - helper function that converts nv21 format to rgba8888 and does blur operation on the converted data.</li>\r\n</ul>\r\nClick processor.cpp to see the full source code for function implementations. A navie implementation of gaussian blur for function <em>gblur</em> can be done very easily using a for loop.\r\n\r\nI will cover the function <em>convertNV21toRGBA8888</em> in a future post. Will try to do two versions\r\n<ul>\r\n	<li>pure c method</li>\r\n	<li>opencl kernel for Snapdragon mobile device</li>\r\n</ul>\r\n<h2>Build (for Linux)</h2>\r\nblah blah blah, i can\'t use raw code!. Lets build it. Android-ndk provides a very useful tool ndk-build. We need to setup some stuff to run the build command <em>ndk-build</em>.\r\n<ol>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test</em> OR Go to root folder of your android application</li>\r\n	<li>Ensure android-ndk installed and environment variable <em>ANDROID_NDK</em> is pointing to ndk installation root</li>\r\n	<li>Ensure environment variable <em>PATH</em> has the path <em>$ANDROID_NDK</em> appened to it</li>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test/jni</em></li>\r\n	<li>Do <em>touch Android.mk and Application.mk</em> and prepare the content of the files as directed below</li>\r\n	<li>Do <em>ndk-build</em> from <em>~/jni_droid_test</em></li>\r\n</ol>\r\n<h3>Android.mk</h3>\r\n<code>\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_MODULE := JNIProcessor\r\nLOCAL_ARM_MODE := arm\r\nLOCAL_SRC_FILES := processor.cpp\r\nLOCAL_CPPFLAGS := -fexceptions\r\nLOCAL_LDLIBS := -ljnigraphics -llog\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n</code>\r\n<em>LOCAL_MODULE := JNIProcessor</em> sets the name of the shared library we are going to build. <em>LOCAL_ARM_MODE := arm</em> declares that library should be built for 32-bit ARM architecture instead of the 16-bit default. <em>LOCAL_SRC_FILES</em> variables should point to all the source files we want to compile, in our case processor.cpp. <em>LOCAL_CPPFLAGS</em> declares that we would be using c++ exceptions in our code. The flags <em>-ljnigraphics</em>, <em>--llog</em> are used for accessing bitmap, print functions respectively. Finally, the line <em>include $(BUILD_SHARED_LIBRARY)</em> that says we want a shared library. In case you want a static version, do the following <em>include $(BUILD_STATIC_LIBRARY)</em>\r\n<h3>Application.mk</h3>\r\n<code>\r\nAPP_OPTIM := release\r\nAPP_STL := gnustl_static\r\nAPP_PLATFORM:= android-14\r\n</code>\r\n\r\n<em>APP_STL</em> is used to state that the library we are going to build will require static version of GNU STL. <em>APP_PLATFORM</em> should be your target-platorm. <em>APP_OPTIM</em> declares that this is a release version of the library. Should you need a debug version, just do <em>APP_OPTIM := debug</em>.\r\n<h2>Use the shared library</h2>\r\nNow, all you need to do to use the function would be load the library when java class is loaded by JVM and declare the gaussianBlur function as member of the corresponding class. For example, say we have a java class shown as below\r\n<code>\r\npackage com.example;\r\npublic class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {\r\nstatic {\r\nSystem.loadLibrary(\"JNIProcessor\");\r\n}\r\nprivate void gaussianBlur(Bitmap out, byte[] in, int width, int height);\r\nprivate Bitmap mTexture;\r\nprivate int width, height;\r\n////TODO: constructors (setup configuration of mTexture like width and height)\r\n////TODO: Code for surfaceCreated(), surfaceChanged(), surfaceDestroyed()\r\npublic void onPreviewFrame(byte[] data, Camera camera) {\r\ngaussianBlur(mTexture,data,width,height);\r\ninvalidate();\r\n}\r\n////TODO: Code onDraw() method that can draw the processed bitmap on to canvas\r\n}\r\n</code>','Working with JNI for Android','','inherit','open','closed','','5574-revision-v1','','','2014-05-15 23:04:38','2014-05-15 23:04:38','',5574,'http://sandbox.arrayfire.com/5574-revision-v1/',0,'revision','',0),(5580,17729,'2014-05-15 23:07:03','2014-05-15 23:07:03','<h2>Code</h2>\r\nI used to use java (jython to be precise) when i used to work as WebSphere (Yes, an IBM product) administrator a really long time back. After such a long gap, i had to look into java again when i needed to do some native level programming for android app.\r\n\r\nMy final target was to do some image processing on camera feed. Out of habit (c/c++), i wanted to start with a header to declare the methods that i saw i would need later. Searching through google gave me couple of options on how to generate the required headers.\r\n<ul>\r\n	<li>Use <a href=\"http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javah.html\">javah</a> and generate</li>\r\n	<li>Write them yourself</li>\r\n</ul>\r\nI took the second route. After a bit of playing with the tedious naming convention for jni functions, i use the following macro to create my function declarations.\r\n<code>\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n</code>\r\n\r\nAn example declaration of function that takes <a href=\"http://www.fourcc.org/yuv.php#NV21\">NV21</a> format data as input and writes output to bitmap will be as follows:\r\n<code>\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n</code>\r\n\r\nI like it this way because it makes my header more readable than it will be if generated using javah. Once the headers are generated, i moved onto actual code.\r\n\r\nUnless you have multiple functions that share same number of input parameters and identical logic, it is hard to abstract the actual code using a macro. In anycase, i don\'t like macros with logic as it makes life hard to debug later. So, I had to write the full signature when implementing the function.\r\n<code>\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\nJNIEnv *env,\r\njclass clazz,\r\njobject outBmp,\r\njByteArray inData,\r\njint width,\r\njint height)\r\n{\r\n// TODO: process the input and write the output\r\n}\r\n</code>\r\n\r\nWith appropriate inclusion of headers and putting together everything we have done so far, the header file and source file will look as below.\r\n\r\nClick processor.h to see the full source code for function declarations. I have included couple of extra android related headers which are required to read bitmap files and print debug messages from jni routines. The c-string pointed by macro <em>app_name</em> can be used to prune the output of command <em>adb logcat</em> to get only the messages that are associated with our jni routines. All you would need to do is to pass on the value of <em>app_name</em> to adb as an option as shown below. It is quite useful when you are debugging problems that are related to accuracy of results.\r\n<code>\r\nadb logcat -s \"JNIProcessor\"\r\n</code>\r\n\r\nNext comes the cpp file. I have added more skeleton code that is required to get to a stage when you have access to the image data. It includes some standard andoird NDK library calls:\r\n<ul>\r\n	<li><em>AndroidBitmap_getInfo</em> - used to get bitmap details like width, height, stride, format.</li>\r\n	<li><em>AndroidBitmap_lockPixels</em> - used to get a pointer to the memory location of image data. Once a lockPixels is called, it has to be followed by a unlockPixels at some point later in the code. Probably creates a copy of original bitmap data which the jvm needs to free up when we are done using it.</li>\r\n	<li><em>GetPrimitiveArrayCritical</em> - As the name suggets, this is some kind of performance critical call. Hence, we should take care of the code that runs between a Get and Release calls runs as fast as possible and doesn\'t stall execution. As per <a href=\"http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html\">Oracle\'s java documenatation</a>, a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.</li>\r\n	<li><em>ReleasePrimitiveArrayCritical</em> - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.</li>\r\n	<li><em>AndroidBitmap_unlockPixels</em> - used to release memory space used by a previous lockPixels call.</li>\r\n</ul>\r\nThere are couple of other functions that are not related to JNI.\r\n<ul>\r\n	<li><em>throwJavaExceptio</em> - convenience function used to throw java exceptions from within jni routines.</li>\r\n	<li><em>blur_helper</em> - helper function that converts nv21 format to rgba8888 and does blur operation on the converted data.</li>\r\n</ul>\r\nClick processor.cpp to see the full source code for function implementations. A navie implementation of gaussian blur for function <em>gblur</em> can be done very easily using a for loop.\r\n\r\nI will cover the function <em>convertNV21toRGBA8888</em> in a future post. Will try to do two versions\r\n<ul>\r\n	<li>pure c method</li>\r\n	<li>opencl kernel for Snapdragon mobile device</li>\r\n</ul>\r\n<h2>Build (for Linux)</h2>\r\nblah blah blah, i can\'t use raw code!. Lets build it. Android-ndk provides a very useful tool ndk-build. We need to setup some stuff to run the build command <em>ndk-build</em>.\r\n<ol>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test</em> OR Go to root folder of your android application</li>\r\n	<li>Ensure android-ndk installed and environment variable <em>ANDROID_NDK</em> is pointing to ndk installation root</li>\r\n	<li>Ensure environment variable <em>PATH</em> has the path <em>$ANDROID_NDK</em> appened to it</li>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test/jni</em></li>\r\n	<li>Do <em>touch Android.mk and Application.mk</em> and prepare the content of the files as directed below</li>\r\n	<li>Do <em>ndk-build</em> from <em>~/jni_droid_test</em></li>\r\n</ol>\r\n<h3>Android.mk</h3>\r\n<code>\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_MODULE := JNIProcessor\r\nLOCAL_ARM_MODE := arm\r\nLOCAL_SRC_FILES := processor.cpp\r\nLOCAL_CPPFLAGS := -fexceptions\r\nLOCAL_LDLIBS := -ljnigraphics -llog\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n</code>\r\n<em>LOCAL_MODULE := JNIProcessor</em> sets the name of the shared library we are going to build. <em>LOCAL_ARM_MODE := arm</em> declares that library should be built for 32-bit ARM architecture instead of the 16-bit default. <em>LOCAL_SRC_FILES</em> variables should point to all the source files we want to compile, in our case processor.cpp. <em>LOCAL_CPPFLAGS</em> declares that we would be using c++ exceptions in our code. The flags <em>-ljnigraphics</em>, <em>--llog</em> are used for accessing bitmap, print functions respectively. Finally, the line <em>include $(BUILD_SHARED_LIBRARY)</em> that says we want a shared library. In case you want a static version, do the following <em>include $(BUILD_STATIC_LIBRARY)</em>\r\n<h3>Application.mk</h3>\r\n<code>\r\nAPP_OPTIM := release\r\nAPP_STL := gnustl_static\r\nAPP_PLATFORM:= android-14\r\n</code>\r\n\r\n<em>APP_STL</em> is used to state that the library we are going to build will require static version of GNU STL. <em>APP_PLATFORM</em> should be your target-platorm. <em>APP_OPTIM</em> declares that this is a release version of the library. Should you need a debug version, just do <em>APP_OPTIM := debug</em>.\r\n<h2>Use the shared library</h2>\r\nNow, all you need to do to use the function would be load the library when java class is loaded by JVM and declare the gaussianBlur function as member of the corresponding class. For example, say we have a java class shown as below\r\n<code>\r\npackage com.example;\r\npublic class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {\r\nstatic {\r\nSystem.loadLibrary(\"JNIProcessor\");\r\n}\r\nprivate void gaussianBlur(Bitmap out, byte[] in, int width, int height);\r\nprivate Bitmap mTexture;\r\nprivate int width, height;\r\n////TODO: constructors (setup configuration of mTexture like width and height)\r\n////TODO: Code for surfaceCreated(), surfaceChanged(), surfaceDestroyed()\r\npublic void onPreviewFrame(byte[] data, Camera camera) {\r\ngaussianBlur(mTexture,data,width,height);\r\ninvalidate();\r\n}\r\n////TODO: Code onDraw() method that can draw the processed bitmap on to canvas\r\n}\r\n</code>','Working with JNI for Android','','inherit','open','closed','','5574-revision-v1','','','2014-05-15 23:07:03','2014-05-15 23:07:03','',5574,'http://sandbox.arrayfire.com/5574-revision-v1/',0,'revision','',0),(5582,17729,'2014-05-15 23:23:42','2014-05-15 23:23:42','<h2>Code</h2>\r\nI used to use java (jython to be precise) when i used to work as WebSphere (Yes, an IBM product) administrator a really long time back. After such a long gap, i had to look into java again when i needed to do some native level programming for android app.\r\n\r\nMy final target was to do some image processing on camera feed. Out of habit (c/c++), i wanted to start with a header to declare the methods that i saw i would need later. Searching through google gave me couple of options on how to generate the required headers.\r\n<ul>\r\n	<li>Use <a href=\"http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javah.html\">javah</a> and generate</li>\r\n	<li>Write them yourself</li>\r\n</ul>\r\nI took the second route. After a bit of playing with the tedious naming convention for jni functions, i use the following macro to create my function declarations.\r\n<code>\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n</code>\r\n\r\nAn example declaration of function that takes <a href=\"http://www.fourcc.org/yuv.php#NV21\">NV21</a> format data as input and writes output to bitmap will be as follows:\r\n<code>\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n</code>\r\n\r\nI like it this way because it makes my header more readable than it will be if generated using javah. Once the headers are generated, i moved onto actual code.\r\n\r\nUnless you have multiple functions that share same number of input parameters and identical logic, it is hard to abstract the actual code using a macro. In anycase, i don\'t like macros with logic as it makes life hard to debug later. So, I had to write the full signature when implementing the function.\r\n<code>\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\nJNIEnv *env,\r\njclass clazz,\r\njobject outBmp,\r\njByteArray inData,\r\njint width,\r\njint height)\r\n{\r\n// TODO: process the input and write the output\r\n}\r\n</code>\r\n\r\nWith appropriate inclusion of headers and putting together everything we have done so far, the header file and source file will look as below.\r\n\r\nClick <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/jni/processor.h\">processor.h</a> to see the full source code for function declarations. I have included couple of extra android related headers which are required to read bitmap files and print debug messages from jni routines. The c-string pointed by macro <em>app_name</em> can be used to prune the output of command <em>adb logcat</em> to get only the messages that are associated with our jni routines. All you would need to do is to pass on the value of <em>app_name</em> to adb as an option as shown below. It is quite useful when you are debugging problems that are related to accuracy of results.\r\n<code>\r\nadb logcat -s \"JNIProcessor\"\r\n</code>\r\n\r\nNext comes the cpp file. I have added more skeleton code that is required to get to a stage when you have access to the image data. It includes some standard andoird NDK library calls:\r\n<ul>\r\n	<li><em>AndroidBitmap_getInfo</em> - used to get bitmap details like width, height, stride, format.</li>\r\n	<li><em>AndroidBitmap_lockPixels</em> - used to get a pointer to the memory location of image data. Once a lockPixels is called, it has to be followed by a unlockPixels at some point later in the code. Probably creates a copy of original bitmap data which the jvm needs to free up when we are done using it.</li>\r\n	<li><em>GetPrimitiveArrayCritical</em> - As the name suggets, this is some kind of performance critical call. Hence, we should take care of the code that runs between a Get and Release calls runs as fast as possible and doesn\'t stall execution. As per <a href=\"http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html\">Oracle\'s java documenatation</a>, a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.</li>\r\n	<li><em>ReleasePrimitiveArrayCritical</em> - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.</li>\r\n	<li><em>AndroidBitmap_unlockPixels</em> - used to release memory space used by a previous lockPixels call.</li>\r\n</ul>\r\nThere are couple of other functions that are not related to JNI.\r\n<ul>\r\n	<li><em>throwJavaExceptio</em> - convenience function used to throw java exceptions from within jni routines.</li>\r\n	<li><em>blur_helper</em> - helper function that converts nv21 format to rgba8888 and does blur operation on the converted data.</li>\r\n</ul>\r\nClick <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/jni/processor.cpp\">processor.cpp</a> to see the full source code for function implementations. A navie implementation of gaussian blur for function <em>gblur</em> can be done very easily using a for loop.\r\n\r\nI will cover the function <em>convertNV21toRGBA8888</em> in a future post. Will try to do two versions\r\n<ul>\r\n	<li>pure c method</li>\r\n	<li>opencl kernel for Snapdragon mobile device</li>\r\n</ul>\r\n<h2>Build (for Linux)</h2>\r\nblah blah blah, i can\'t use raw code!. Lets build it. Android-ndk provides a very useful tool ndk-build. We need to setup some stuff to run the build command <em>ndk-build</em>.\r\n<ol>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test</em> OR Go to root folder of your android application</li>\r\n	<li>Ensure android-ndk installed and environment variable <em>ANDROID_NDK</em> is pointing to ndk installation root</li>\r\n	<li>Ensure environment variable <em>PATH</em> has the path <em>$ANDROID_NDK</em> appened to it</li>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test/jni</em></li>\r\n	<li>Do <em>touch Android.mk and Application.mk</em> and prepare the content of the files as directed below</li>\r\n	<li>Do <em>ndk-build</em> from <em>~/jni_droid_test</em></li>\r\n</ol>\r\n<h3>Android.mk</h3>\r\n<code>\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_MODULE := JNIProcessor\r\nLOCAL_ARM_MODE := arm\r\nLOCAL_SRC_FILES := processor.cpp\r\nLOCAL_CPPFLAGS := -fexceptions\r\nLOCAL_LDLIBS := -ljnigraphics -llog\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n</code>\r\n<em>LOCAL_MODULE := JNIProcessor</em> sets the name of the shared library we are going to build. <em>LOCAL_ARM_MODE := arm</em> declares that library should be built for 32-bit ARM architecture instead of the 16-bit default. <em>LOCAL_SRC_FILES</em> variables should point to all the source files we want to compile, in our case processor.cpp. <em>LOCAL_CPPFLAGS</em> declares that we would be using c++ exceptions in our code. The flags <em>-ljnigraphics</em>, <em>--llog</em> are used for accessing bitmap, print functions respectively. Finally, the line <em>include $(BUILD_SHARED_LIBRARY)</em> that says we want a shared library. In case you want a static version, do the following <em>include $(BUILD_STATIC_LIBRARY)</em>\r\n\r\n<h3>Application.mk</h3>\r\n<code>\r\nAPP_OPTIM := release\r\nAPP_STL := gnustl_static\r\nAPP_PLATFORM:= android-14\r\n</code>\r\n<em>APP_STL</em> is used to state that the library we are going to build will require static version of GNU STL. <em>APP_PLATFORM</em> should be your target-platorm. <em>APP_OPTIM</em> declares that this is a release version of the library. Should you need a debug version, just do <em>APP_OPTIM := debug</em>.\r\n\r\n<h2>Use the shared library</h2>\r\nNow, all you need to do to use the function would be load the library when java class is loaded by JVM and declare the <em>gaussianBlur</em> function as member of the corresponding class. For example, we can use the jni routines we created using a java class such as shown <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/src/com/example/CameraPreview.java\">here</a>\r\n\r\nThe entire skeleton code is avaiable on github at <a href=\"https://github.com/9prady9/skeletons/tree/master/jni_droid_test\">template</a>','Working with JNI for Android','','inherit','open','closed','','5574-revision-v1','','','2014-05-15 23:23:42','2014-05-15 23:23:42','',5574,'http://sandbox.arrayfire.com/5574-revision-v1/',0,'revision','',0),(5583,17729,'2014-05-15 23:35:53','2014-05-15 23:35:53','<h2>Code</h2>\r\nI used to use java (jython to be precise) when i used to work as WebSphere (Yes, an IBM product) administrator a really long time back. After such a long gap, i had to look into java again when i needed to do some native level programming for android app.\r\n\r\nMy final target was to do some image processing on camera feed. Out of habit (c/c++), i wanted to start with a header to declare the methods that i saw i would need later. Searching through google gave me couple of options on how to generate the required headers.\r\n<ul>\r\n	<li>Use <a href=\"http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javah.html\">javah</a> and generate</li>\r\n	<li>Write them yourself</li>\r\n</ul>\r\nI took the second route. After a bit of playing with the tedious naming convention for jni functions, i use the following macro to create my function declarations.\r\n<code>\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n</code>\r\n\r\nAn example declaration of function that takes <a href=\"http://www.fourcc.org/yuv.php#NV21\">NV21</a> format data as input and writes output to bitmap will be as follows:\r\n<code>\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n</code>\r\n\r\nI like it this way because it makes my header more readable than it will be if generated using javah. Once the headers are generated, i moved onto actual code.\r\n\r\nUnless you have multiple functions that share same number of input parameters and identical logic, it is hard to abstract the actual code using a macro. In anycase, i don\'t like macros with logic as it makes life hard to debug later. So, I had to write the full signature when implementing the function.\r\n<code>\r\n[code]</code>\r\n\r\n<span style=\"font-family: monospace; line-height: 1.5em;\">JNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(</span>\r\n\r\n<span style=\"font-family: monospace;\">JNIEnv *env,</span><br style=\"font-family: monospace;\" /><span style=\"font-family: monospace;\">jclass clazz,</span><br style=\"font-family: monospace;\" /><span style=\"font-family: monospace;\">jobject outBmp,</span><br style=\"font-family: monospace;\" /><span style=\"font-family: monospace;\">jByteArray inData,</span><br style=\"font-family: monospace;\" /><span style=\"font-family: monospace;\">jint width,</span><br style=\"font-family: monospace;\" /><span style=\"font-family: monospace;\">jint height)</span><br style=\"font-family: monospace;\" /><span style=\"font-family: monospace;\">{</span><br style=\"font-family: monospace;\" /><span style=\"font-family: monospace;\">// TODO: process the input and write the output</span>\r\n\r\n<code><span style=\"line-height: 1.5em;\">}</span></code>\r\n\r\n<code>[/code]\r\n</code>\r\n\r\nWith appropriate inclusion of headers and putting together everything we have done so far, the header file and source file will look as below.\r\n\r\nClick <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/jni/processor.h\">processor.h</a> to see the full source code for function declarations. I have included couple of extra android related headers which are required to read bitmap files and print debug messages from jni routines. The c-string pointed by macro <em>app_name</em> can be used to prune the output of command <em>adb logcat</em> to get only the messages that are associated with our jni routines. All you would need to do is to pass on the value of <em>app_name</em> to adb as an option as shown below. It is quite useful when you are debugging problems that are related to accuracy of results.\r\n<code>\r\nadb logcat -s \"JNIProcessor\"\r\n</code>\r\n\r\nNext comes the cpp file. I have added more skeleton code that is required to get to a stage when you have access to the image data. It includes some standard andoird NDK library calls:\r\n<ul>\r\n	<li><em>AndroidBitmap_getInfo</em> - used to get bitmap details like width, height, stride, format.</li>\r\n	<li><em>AndroidBitmap_lockPixels</em> - used to get a pointer to the memory location of image data. Once a lockPixels is called, it has to be followed by a unlockPixels at some point later in the code. Probably creates a copy of original bitmap data which the jvm needs to free up when we are done using it.</li>\r\n	<li><em>GetPrimitiveArrayCritical</em> - As the name suggets, this is some kind of performance critical call. Hence, we should take care of the code that runs between a Get and Release calls runs as fast as possible and doesn\'t stall execution. As per <a href=\"http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html\">Oracle\'s java documenatation</a>, a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.</li>\r\n	<li><em>ReleasePrimitiveArrayCritical</em> - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.</li>\r\n	<li><em>AndroidBitmap_unlockPixels</em> - used to release memory space used by a previous lockPixels call.</li>\r\n</ul>\r\nThere are couple of other functions that are not related to JNI.\r\n<ul>\r\n	<li><em>throwJavaExceptio</em> - convenience function used to throw java exceptions from within jni routines.</li>\r\n	<li><em>blur_helper</em> - helper function that converts nv21 format to rgba8888 and does blur operation on the converted data.</li>\r\n</ul>\r\nClick <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/jni/processor.cpp\">processor.cpp</a> to see the full source code for function implementations. A navie implementation of gaussian blur for function <em>gblur</em> can be done very easily using a for loop.\r\n\r\nI will cover the function <em>convertNV21toRGBA8888</em> in a future post. Will try to do two versions\r\n<ul>\r\n	<li>pure c method</li>\r\n	<li>opencl kernel for Snapdragon mobile device</li>\r\n</ul>\r\n<h2>Build (for Linux)</h2>\r\nblah blah blah, i can\'t use raw code!. Lets build it. Android-ndk provides a very useful tool ndk-build. We need to setup some stuff to run the build command <em>ndk-build</em>.\r\n<ol>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test</em> OR Go to root folder of your android application</li>\r\n	<li>Ensure android-ndk installed and environment variable <em>ANDROID_NDK</em> is pointing to ndk installation root</li>\r\n	<li>Ensure environment variable <em>PATH</em> has the path <em>$ANDROID_NDK</em> appened to it</li>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test/jni</em></li>\r\n	<li>Do <em>touch Android.mk and Application.mk</em> and prepare the content of the files as directed below</li>\r\n	<li>Do <em>ndk-build</em> from <em>~/jni_droid_test</em></li>\r\n</ol>\r\n<h3>Android.mk</h3>\r\n<code>\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_MODULE := JNIProcessor\r\nLOCAL_ARM_MODE := arm\r\nLOCAL_SRC_FILES := processor.cpp\r\nLOCAL_CPPFLAGS := -fexceptions\r\nLOCAL_LDLIBS := -ljnigraphics -llog\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n</code>\r\n<em>LOCAL_MODULE := JNIProcessor</em> sets the name of the shared library we are going to build. <em>LOCAL_ARM_MODE := arm</em> declares that library should be built for 32-bit ARM architecture instead of the 16-bit default. <em>LOCAL_SRC_FILES</em> variables should point to all the source files we want to compile, in our case processor.cpp. <em>LOCAL_CPPFLAGS</em> declares that we would be using c++ exceptions in our code. The flags <em>-ljnigraphics</em>, <em>--llog</em> are used for accessing bitmap, print functions respectively. Finally, the line <em>include $(BUILD_SHARED_LIBRARY)</em> that says we want a shared library. In case you want a static version, do the following <em>include $(BUILD_STATIC_LIBRARY)</em>\r\n<h3>Application.mk</h3>\r\n<code>\r\nAPP_OPTIM := release\r\nAPP_STL := gnustl_static\r\nAPP_PLATFORM:= android-14\r\n</code>\r\n<em>APP_STL</em> is used to state that the library we are going to build will require static version of GNU STL. <em>APP_PLATFORM</em> should be your target-platorm. <em>APP_OPTIM</em> declares that this is a release version of the library. Should you need a debug version, just do <em>APP_OPTIM := debug</em>.\r\n<h2>Use the shared library</h2>\r\nNow, all you need to do to use the function would be load the library when java class is loaded by JVM and declare the <em>gaussianBlur</em> function as member of the corresponding class. For example, we can use the jni routines we created using a java class such as shown <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/src/com/example/CameraPreview.java\">here</a>\r\n\r\nThe entire skeleton code is avaiable on github at <a href=\"https://github.com/9prady9/skeletons/tree/master/jni_droid_test\">template</a>','Working with JNI for Android','','inherit','open','closed','','5574-revision-v1','','','2014-05-15 23:35:53','2014-05-15 23:35:53','',5574,'http://sandbox.arrayfire.com/5574-revision-v1/',0,'revision','',0),(5584,17729,'2014-05-15 23:37:28','2014-05-15 23:37:28','<h2>Code</h2>\r\nI used to use java (jython to be precise) when i used to work as WebSphere (Yes, an IBM product) administrator a really long time back. After such a long gap, i had to look into java again when i needed to do some native level programming for android app.\r\n\r\nMy final target was to do some image processing on camera feed. Out of habit (c/c++), i wanted to start with a header to declare the methods that i saw i would need later. Searching through google gave me couple of options on how to generate the required headers.\r\n<ul>\r\n	<li>Use <a href=\"http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javah.html\">javah</a> and generate</li>\r\n	<li>Write them yourself</li>\r\n</ul>\r\nI took the second route. After a bit of playing with the tedious naming convention for jni functions, i use the following macro to create my function declarations.\r\n<code>\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n</code>\r\n\r\nAn example declaration of function that takes <a href=\"http://www.fourcc.org/yuv.php#NV21\">NV21</a> format data as input and writes output to bitmap will be as follows:\r\n<code>\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n</code>\r\n\r\nI like it this way because it makes my header more readable than it will be if generated using javah. Once the headers are generated, i moved onto actual code.\r\n\r\nUnless you have multiple functions that share same number of input parameters and identical logic, it is hard to abstract the actual code using a macro. In anycase, i don\'t like macros with logic as it makes life hard to debug later. So, I had to write the full signature when implementing the function.\r\n\r\n[code]\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\n				JNIEnv      *env,\r\n				jclass      clazz,\r\n				jobject     outBmp,\r\n				jByteArray  inData,\r\n				jint        width,\r\n				jint        height)\r\n{\r\n	// TODO: process the input and write the output\r\n}\r\n[/code]\r\n\r\nWith appropriate inclusion of headers and putting together everything we have done so far, the header file and source file will look as below.\r\n\r\nClick <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/jni/processor.h\">processor.h</a> to see the full source code for function declarations. I have included couple of extra android related headers which are required to read bitmap files and print debug messages from jni routines. The c-string pointed by macro <em>app_name</em> can be used to prune the output of command <em>adb logcat</em> to get only the messages that are associated with our jni routines. All you would need to do is to pass on the value of <em>app_name</em> to adb as an option as shown below. It is quite useful when you are debugging problems that are related to accuracy of results.\r\n<code>\r\nadb logcat -s \"JNIProcessor\"\r\n</code>\r\n\r\nNext comes the cpp file. I have added more skeleton code that is required to get to a stage when you have access to the image data. It includes some standard andoird NDK library calls:\r\n<ul>\r\n	<li><em>AndroidBitmap_getInfo</em> - used to get bitmap details like width, height, stride, format.</li>\r\n	<li><em>AndroidBitmap_lockPixels</em> - used to get a pointer to the memory location of image data. Once a lockPixels is called, it has to be followed by a unlockPixels at some point later in the code. Probably creates a copy of original bitmap data which the jvm needs to free up when we are done using it.</li>\r\n	<li><em>GetPrimitiveArrayCritical</em> - As the name suggets, this is some kind of performance critical call. Hence, we should take care of the code that runs between a Get and Release calls runs as fast as possible and doesn\'t stall execution. As per <a href=\"http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html\">Oracle\'s java documenatation</a>, a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.</li>\r\n	<li><em>ReleasePrimitiveArrayCritical</em> - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.</li>\r\n	<li><em>AndroidBitmap_unlockPixels</em> - used to release memory space used by a previous lockPixels call.</li>\r\n</ul>\r\nThere are couple of other functions that are not related to JNI.\r\n<ul>\r\n	<li><em>throwJavaExceptio</em> - convenience function used to throw java exceptions from within jni routines.</li>\r\n	<li><em>blur_helper</em> - helper function that converts nv21 format to rgba8888 and does blur operation on the converted data.</li>\r\n</ul>\r\nClick <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/jni/processor.cpp\">processor.cpp</a> to see the full source code for function implementations. A navie implementation of gaussian blur for function <em>gblur</em> can be done very easily using a for loop.\r\n\r\nI will cover the function <em>convertNV21toRGBA8888</em> in a future post. Will try to do two versions\r\n<ul>\r\n	<li>pure c method</li>\r\n	<li>opencl kernel for Snapdragon mobile device</li>\r\n</ul>\r\n<h2>Build (for Linux)</h2>\r\nblah blah blah, i can\'t use raw code!. Lets build it. Android-ndk provides a very useful tool ndk-build. We need to setup some stuff to run the build command <em>ndk-build</em>.\r\n<ol>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test</em> OR Go to root folder of your android application</li>\r\n	<li>Ensure android-ndk installed and environment variable <em>ANDROID_NDK</em> is pointing to ndk installation root</li>\r\n	<li>Ensure environment variable <em>PATH</em> has the path <em>$ANDROID_NDK</em> appened to it</li>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test/jni</em></li>\r\n	<li>Do <em>touch Android.mk and Application.mk</em> and prepare the content of the files as directed below</li>\r\n	<li>Do <em>ndk-build</em> from <em>~/jni_droid_test</em></li>\r\n</ol>\r\n<h3>Android.mk</h3>\r\n<code>\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_MODULE := JNIProcessor\r\nLOCAL_ARM_MODE := arm\r\nLOCAL_SRC_FILES := processor.cpp\r\nLOCAL_CPPFLAGS := -fexceptions\r\nLOCAL_LDLIBS := -ljnigraphics -llog\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n</code>\r\n<em>LOCAL_MODULE := JNIProcessor</em> sets the name of the shared library we are going to build. <em>LOCAL_ARM_MODE := arm</em> declares that library should be built for 32-bit ARM architecture instead of the 16-bit default. <em>LOCAL_SRC_FILES</em> variables should point to all the source files we want to compile, in our case processor.cpp. <em>LOCAL_CPPFLAGS</em> declares that we would be using c++ exceptions in our code. The flags <em>-ljnigraphics</em>, <em>--llog</em> are used for accessing bitmap, print functions respectively. Finally, the line <em>include $(BUILD_SHARED_LIBRARY)</em> that says we want a shared library. In case you want a static version, do the following <em>include $(BUILD_STATIC_LIBRARY)</em>\r\n<h3>Application.mk</h3>\r\n<code>\r\nAPP_OPTIM := release\r\nAPP_STL := gnustl_static\r\nAPP_PLATFORM:= android-14\r\n</code>\r\n<em>APP_STL</em> is used to state that the library we are going to build will require static version of GNU STL. <em>APP_PLATFORM</em> should be your target-platorm. <em>APP_OPTIM</em> declares that this is a release version of the library. Should you need a debug version, just do <em>APP_OPTIM := debug</em>.\r\n<h2>Use the shared library</h2>\r\nNow, all you need to do to use the function would be load the library when java class is loaded by JVM and declare the <em>gaussianBlur</em> function as member of the corresponding class. For example, we can use the jni routines we created using a java class such as shown <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/src/com/example/CameraPreview.java\">here</a>\r\n\r\nThe entire skeleton code is avaiable on github at <a href=\"https://github.com/9prady9/skeletons/tree/master/jni_droid_test\">template</a>','Working with JNI for Android','','inherit','open','closed','','5574-revision-v1','','','2014-05-15 23:37:28','2014-05-15 23:37:28','',5574,'http://sandbox.arrayfire.com/5574-revision-v1/',0,'revision','',0),(5585,17729,'2014-05-15 23:56:41','2014-05-15 23:56:41','<h2>Code</h2>\r\nI used to use java (jython to be precise) when i used to work as WebSphere (Yes, an IBM product) administrator a really long time back. After such a long gap, i had to look into java again when i needed to do some native level programming for android app.\r\n\r\nMy final target was to do some image processing on camera feed. Out of habit (c/c++), i wanted to start with a header to declare the methods that i saw i would need later. Searching through google gave me couple of options on how to generate the required headers.\r\n<ul>\r\n	<li>Use <a href=\"http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javah.html\">javah</a> and generate</li>\r\n	<li>Write them yourself</li>\r\n</ul>\r\nI took the second route. After a bit of playing with the tedious naming convention for jni functions, i use the following macro to create my function declarations.\r\n<code>\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n</code>\r\n\r\nAn example declaration of function that takes <a href=\"http://www.fourcc.org/yuv.php#NV21\">NV21</a> format data as input and writes output to bitmap will be as follows:\r\n<code>\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n</code>\r\n\r\nI like it this way because it makes my header more readable than it will be if generated using javah. Once the headers are generated, i moved onto actual code.\r\n\r\nUnless you have multiple functions that share same number of input parameters and identical logic, it is hard to abstract the actual code using a macro. In anycase, i don\'t like macros with logic as it makes life hard to debug later. So, I had to write the full signature when implementing the function.\r\n\r\n<pre class=\"brush:c\">\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\nJNIEnv *env,\r\njclass clazz,\r\njobject outBmp,\r\njByteArray inData,\r\njint width,\r\njint height)\r\n{\r\n// TODO: process the input and write the output\r\n}\r\n</pre>\r\n\r\nWith appropriate inclusion of headers and putting together everything we have done so far, the header file and source file will look as below.\r\n\r\nClick <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/jni/processor.h\">processor.h</a> to see the full source code for function declarations. I have included couple of extra android related headers which are required to read bitmap files and print debug messages from jni routines. The c-string pointed by macro <em>app_name</em> can be used to prune the output of command <em>adb logcat</em> to get only the messages that are associated with our jni routines. All you would need to do is to pass on the value of <em>app_name</em> to adb as an option as shown below. It is quite useful when you are debugging problems that are related to accuracy of results.\r\n<code>\r\nadb logcat -s \"JNIProcessor\"\r\n</code>\r\n\r\nNext comes the cpp file. I have added more skeleton code that is required to get to a stage when you have access to the image data. It includes some standard andoird NDK library calls:\r\n<ul>\r\n	<li><em>AndroidBitmap_getInfo</em> - used to get bitmap details like width, height, stride, format.</li>\r\n	<li><em>AndroidBitmap_lockPixels</em> - used to get a pointer to the memory location of image data. Once a lockPixels is called, it has to be followed by a unlockPixels at some point later in the code. Probably creates a copy of original bitmap data which the jvm needs to free up when we are done using it.</li>\r\n	<li><em>GetPrimitiveArrayCritical</em> - As the name suggets, this is some kind of performance critical call. Hence, we should take care of the code that runs between a Get and Release calls runs as fast as possible and doesn\'t stall execution. As per <a href=\"http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html\">Oracle\'s java documenatation</a>, a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.</li>\r\n	<li><em>ReleasePrimitiveArrayCritical</em> - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.</li>\r\n	<li><em>AndroidBitmap_unlockPixels</em> - used to release memory space used by a previous lockPixels call.</li>\r\n</ul>\r\nThere are couple of other functions that are not related to JNI.\r\n<ul>\r\n	<li><em>throwJavaExceptio</em> - convenience function used to throw java exceptions from within jni routines.</li>\r\n	<li><em>blur_helper</em> - helper function that converts nv21 format to rgba8888 and does blur operation on the converted data.</li>\r\n</ul>\r\nClick <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/jni/processor.cpp\">processor.cpp</a> to see the full source code for function implementations. A navie implementation of gaussian blur for function <em>gblur</em> can be done very easily using a for loop.\r\n\r\nI will cover the function <em>convertNV21toRGBA8888</em> in a future post. Will try to do two versions\r\n<ul>\r\n	<li>pure c method</li>\r\n	<li>opencl kernel for Snapdragon mobile device</li>\r\n</ul>\r\n<h2>Build (for Linux)</h2>\r\nblah blah blah, i can\'t use raw code!. Lets build it. Android-ndk provides a very useful tool ndk-build. We need to setup some stuff to run the build command <em>ndk-build</em>.\r\n<ol>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test</em> OR Go to root folder of your android application</li>\r\n	<li>Ensure android-ndk installed and environment variable <em>ANDROID_NDK</em> is pointing to ndk installation root</li>\r\n	<li>Ensure environment variable <em>PATH</em> has the path <em>$ANDROID_NDK</em> appened to it</li>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test/jni</em></li>\r\n	<li>Do <em>touch Android.mk and Application.mk</em> and prepare the content of the files as directed below</li>\r\n	<li>Do <em>ndk-build</em> from <em>~/jni_droid_test</em></li>\r\n</ol>\r\n<h3>Android.mk</h3>\r\n<code>\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_MODULE := JNIProcessor\r\nLOCAL_ARM_MODE := arm\r\nLOCAL_SRC_FILES := processor.cpp\r\nLOCAL_CPPFLAGS := -fexceptions\r\nLOCAL_LDLIBS := -ljnigraphics -llog\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n</code>\r\n<em>LOCAL_MODULE := JNIProcessor</em> sets the name of the shared library we are going to build. <em>LOCAL_ARM_MODE := arm</em> declares that library should be built for 32-bit ARM architecture instead of the 16-bit default. <em>LOCAL_SRC_FILES</em> variables should point to all the source files we want to compile, in our case processor.cpp. <em>LOCAL_CPPFLAGS</em> declares that we would be using c++ exceptions in our code. The flags <em>-ljnigraphics</em>, <em>--llog</em> are used for accessing bitmap, print functions respectively. Finally, the line <em>include $(BUILD_SHARED_LIBRARY)</em> that says we want a shared library. In case you want a static version, do the following <em>include $(BUILD_STATIC_LIBRARY)</em>\r\n<h3>Application.mk</h3>\r\n<code>\r\nAPP_OPTIM := release\r\nAPP_STL := gnustl_static\r\nAPP_PLATFORM:= android-14\r\n</code>\r\n<em>APP_STL</em> is used to state that the library we are going to build will require static version of GNU STL. <em>APP_PLATFORM</em> should be your target-platorm. <em>APP_OPTIM</em> declares that this is a release version of the library. Should you need a debug version, just do <em>APP_OPTIM := debug</em>.\r\n<h2>Use the shared library</h2>\r\nNow, all you need to do to use the function would be load the library when java class is loaded by JVM and declare the <em>gaussianBlur</em> function as member of the corresponding class. For example, we can use the jni routines we created using a java class such as shown <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/src/com/example/CameraPreview.java\">here</a>\r\n\r\nThe entire skeleton code is avaiable on github at <a href=\"https://github.com/9prady9/skeletons/tree/master/jni_droid_test\">template</a>','Working with JNI for Android','','inherit','open','closed','','5574-revision-v1','','','2014-05-15 23:56:41','2014-05-15 23:56:41','',5574,'http://sandbox.arrayfire.com/5574-revision-v1/',0,'revision','',0),(5586,17729,'2014-05-15 23:57:08','2014-05-15 23:57:08','<h2>Code</h2>\r\nI used to use java (jython to be precise) when i used to work as WebSphere (Yes, an IBM product) administrator a really long time back. After such a long gap, i had to look into java again when i needed to do some native level programming for android app.\r\n\r\nMy final target was to do some image processing on camera feed. Out of habit (c/c++), i wanted to start with a header to declare the methods that i saw i would need later. Searching through google gave me couple of options on how to generate the required headers.\r\n<ul>\r\n	<li>Use <a href=\"http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javah.html\">javah</a> and generate</li>\r\n	<li>Write them yourself</li>\r\n</ul>\r\nI took the second route. After a bit of playing with the tedious naming convention for jni functions, i use the following macro to create my function declarations.\r\n<code>\r\n#define DECLARE(returnType,fullClassName,func,...) \\\r\nJNIEXPORT returnType JNICALL Java_##fullClassName##_##func(JNIEnv *env, jclass clazz,__VA_ARGS__);\r\n</code>\r\n\r\nAn example declaration of function that takes <a href=\"http://www.fourcc.org/yuv.php#NV21\">NV21</a> format data as input and writes output to bitmap will be as follows:\r\n<code>\r\nDECLARE(void,com_example_CameraPreview,gaussianBlur,jobject outBmp, jbyteArray inData, jint width, jint height)\r\n</code>\r\n\r\nI like it this way because it makes my header more readable than it will be if generated using javah. Once the headers are generated, i moved onto actual code.\r\n\r\nUnless you have multiple functions that share same number of input parameters and identical logic, it is hard to abstract the actual code using a macro. In anycase, i don\'t like macros with logic as it makes life hard to debug later. So, I had to write the full signature when implementing the function.\r\n\r\n<code class=\"brush:c\">\r\nJNIEXPORT void JNICALL Java_com_example_CameraPreview_gaussianBlur(\r\nJNIEnv *env,\r\njclass clazz,\r\njobject outBmp,\r\njByteArray inData,\r\njint width,\r\njint height)\r\n{\r\n// TODO: process the input and write the output\r\n}\r\n</code>\r\n\r\nWith appropriate inclusion of headers and putting together everything we have done so far, the header file and source file will look as below.\r\n\r\nClick <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/jni/processor.h\">processor.h</a> to see the full source code for function declarations. I have included couple of extra android related headers which are required to read bitmap files and print debug messages from jni routines. The c-string pointed by macro <em>app_name</em> can be used to prune the output of command <em>adb logcat</em> to get only the messages that are associated with our jni routines. All you would need to do is to pass on the value of <em>app_name</em> to adb as an option as shown below. It is quite useful when you are debugging problems that are related to accuracy of results.\r\n<code>\r\nadb logcat -s \"JNIProcessor\"\r\n</code>\r\n\r\nNext comes the cpp file. I have added more skeleton code that is required to get to a stage when you have access to the image data. It includes some standard andoird NDK library calls:\r\n<ul>\r\n	<li><em>AndroidBitmap_getInfo</em> - used to get bitmap details like width, height, stride, format.</li>\r\n	<li><em>AndroidBitmap_lockPixels</em> - used to get a pointer to the memory location of image data. Once a lockPixels is called, it has to be followed by a unlockPixels at some point later in the code. Probably creates a copy of original bitmap data which the jvm needs to free up when we are done using it.</li>\r\n	<li><em>GetPrimitiveArrayCritical</em> - As the name suggets, this is some kind of performance critical call. Hence, we should take care of the code that runs between a Get and Release calls runs as fast as possible and doesn\'t stall execution. As per <a href=\"http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html\">Oracle\'s java documenatation</a>, a VM may temporarily disable garbage collection when the native code is holding a pointer to an array obtained via GetPrimitiveArrayCritical. So, just be careful when you use this function.</li>\r\n	<li><em>ReleasePrimitiveArrayCritical</em> - used to release the memory space requested by previous GetPrimitiveArrayCritical. call.</li>\r\n	<li><em>AndroidBitmap_unlockPixels</em> - used to release memory space used by a previous lockPixels call.</li>\r\n</ul>\r\nThere are couple of other functions that are not related to JNI.\r\n<ul>\r\n	<li><em>throwJavaExceptio</em> - convenience function used to throw java exceptions from within jni routines.</li>\r\n	<li><em>blur_helper</em> - helper function that converts nv21 format to rgba8888 and does blur operation on the converted data.</li>\r\n</ul>\r\nClick <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/jni/processor.cpp\">processor.cpp</a> to see the full source code for function implementations. A navie implementation of gaussian blur for function <em>gblur</em> can be done very easily using a for loop.\r\n\r\nI will cover the function <em>convertNV21toRGBA8888</em> in a future post. Will try to do two versions\r\n<ul>\r\n	<li>pure c method</li>\r\n	<li>opencl kernel for Snapdragon mobile device</li>\r\n</ul>\r\n<h2>Build (for Linux)</h2>\r\nblah blah blah, i can\'t use raw code!. Lets build it. Android-ndk provides a very useful tool ndk-build. We need to setup some stuff to run the build command <em>ndk-build</em>.\r\n<ol>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test</em> OR Go to root folder of your android application</li>\r\n	<li>Ensure android-ndk installed and environment variable <em>ANDROID_NDK</em> is pointing to ndk installation root</li>\r\n	<li>Ensure environment variable <em>PATH</em> has the path <em>$ANDROID_NDK</em> appened to it</li>\r\n	<li>Do <em>mkdir -p ~/jni_droid_test/jni</em></li>\r\n	<li>Do <em>touch Android.mk and Application.mk</em> and prepare the content of the files as directed below</li>\r\n	<li>Do <em>ndk-build</em> from <em>~/jni_droid_test</em></li>\r\n</ol>\r\n<h3>Android.mk</h3>\r\n<code>\r\nLOCAL_PATH := $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_MODULE := JNIProcessor\r\nLOCAL_ARM_MODE := arm\r\nLOCAL_SRC_FILES := processor.cpp\r\nLOCAL_CPPFLAGS := -fexceptions\r\nLOCAL_LDLIBS := -ljnigraphics -llog\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n</code>\r\n<em>LOCAL_MODULE := JNIProcessor</em> sets the name of the shared library we are going to build. <em>LOCAL_ARM_MODE := arm</em> declares that library should be built for 32-bit ARM architecture instead of the 16-bit default. <em>LOCAL_SRC_FILES</em> variables should point to all the source files we want to compile, in our case processor.cpp. <em>LOCAL_CPPFLAGS</em> declares that we would be using c++ exceptions in our code. The flags <em>-ljnigraphics</em>, <em>--llog</em> are used for accessing bitmap, print functions respectively. Finally, the line <em>include $(BUILD_SHARED_LIBRARY)</em> that says we want a shared library. In case you want a static version, do the following <em>include $(BUILD_STATIC_LIBRARY)</em>\r\n<h3>Application.mk</h3>\r\n<code>\r\nAPP_OPTIM := release\r\nAPP_STL := gnustl_static\r\nAPP_PLATFORM:= android-14\r\n</code>\r\n<em>APP_STL</em> is used to state that the library we are going to build will require static version of GNU STL. <em>APP_PLATFORM</em> should be your target-platorm. <em>APP_OPTIM</em> declares that this is a release version of the library. Should you need a debug version, just do <em>APP_OPTIM := debug</em>.\r\n<h2>Use the shared library</h2>\r\nNow, all you need to do to use the function would be load the library when java class is loaded by JVM and declare the <em>gaussianBlur</em> function as member of the corresponding class. For example, we can use the jni routines we created using a java class such as shown <a href=\"https://github.com/9prady9/skeletons/blob/master/jni_droid_test/src/com/example/CameraPreview.java\">here</a>\r\n\r\nThe entire skeleton code is avaiable on github at <a href=\"https://github.com/9prady9/skeletons/tree/master/jni_droid_test\">template</a>','Working with JNI for Android','','inherit','open','closed','','5574-revision-v1','','','2014-05-15 23:57:08','2014-05-15 23:57:08','',5574,'http://sandbox.arrayfire.com/5574-revision-v1/',0,'revision','',0),