Android平台利用CUDA框架实现并行开发

来源:互联网 发布:原生js手风琴效果 编辑:程序博客网 时间:2024/06/06 03:29
本文运行的例程使用NVIDIA Jeston X1平台运行,该平台的核心GPU为Tegra X1,搭载Android操作系统。本文通过三部分介绍Android平台下实现CUDA并行开发:第一部分是搭建开发环境;第二部分是交叉编译CUDA源代码;第三部分是CUDA实例说明。
 

1.   搭建Android-CUDA开发环境

本文在ubuntu 14.04环境中搭建开发环境,安装过程主要分为以下三个目标:

   目标1:首先安装elicpse软件所需要的Java Development Kit (JDK)开发工具包,为搭建开发环境作基础。

   目标2JDK安装完成后,在 nvidia官网下载“NVIDIA CodeWorks for Android”工具包,这个工具包由nvidia公司整理打包,其中包括所有用于开发环境的软件(如eclipse, Android_sdk, Android_ndk等软件)。CodeWorksforAndroid软件包可以在nvidia官网https://developer.nvidia.com/codeworks-android”下载。

本次安装的开发环境是在官网下载的 “CodeWorksforAndroid-1R4-linux-x64.run”文件包。下载完成后可以通过命令行直接运行。

 目标3:运行Android-CUDA自带实例,检查安装环境是否搭建成功。进入eclipse软件,载入工程文件。如果通过NDK正常编译,并且可以正常运行在Tegra X1平台内,说明Android-CUDA开发环境已经正确搭建好。

2.   Android系统下CUDA文件编译

     1、源代码使用CUDA编写的“*.cu文件”只能通过nvcc编译器来编译然而工程最终需要的“*.SO文件”需要使用andorid-NDK-build编译器将C语言编写的源文件编译打包为“*.SO文件”那么如何将CUDA编写的“*.cu文件”加载到“*.SO文件”就是十分关键的。

2、由于将CUDA编写的“*.cu文件”加载到“*.so文件”比较复杂,因此通过两个步骤完成

   步骤一:通过nvcc编译器把“*.cu文件”首先编译为可执行文件;再将可执行文件生成一个静态链接库

   步骤二:最后把静态链接库的加载到“*.SO文件”。   

3.    CUDA实例BoxFilter的目录结构 

在这个工程文件中包含jni文件夹,cuda文件夹,以及libs文件夹。在com.examlpe.boxfilter文件夹内含有buildConfig.javaR.java文件。jni文件夹中包含C++的源文件NativeApp.cppUtils.cpp和头文件NativeApp.hUtils.h以及android.mkApplication.mk配置文件。

cuda文件夹包含boxFilter_kernel.cuboxFilter_kernel.h等与cuda有关的文件。libs中包含相关的库文件如:nv_and_utilnv_egl_utilnv_shader等文件。

         编译时首先在 /cuda文件夹下由MakefileboxFilter_kernel.cuboxFilter_kernel.h等与cuda有关的文件生成lib_boxFiler.a文件;此后,通过NDK编译器将C++源文件编译生成为libboxfiler.so由于在NDK编译C++文件时没有将lib_boxFiler.a”库文件载入libboxfiler.so内。所以可能在应用程序“boxFilter”运行时,在需要调用CUDA时向“lib_boxFiler.a”库文件调用CUDA内容。