Spark + Aparapi = SparkCL
- 其中Spark都很熟悉了,是云计算框架,将Hadoop 里的Mapreduce优化了。
- Aparapi 是Java版的Opencl,不用JavaCL的原因是,JavaCL需要更多底层的操作,而我们的目的只是调用一下GPU进行计算,并不管具体GPU并行的事情。另外,Aparapi有一个容错机制,就是如果没有检测到GPU硬件的话,就会返回给JVM来运行(在源码KernelRunner.java 333行)。
SparkCL的改进
经过example里代码的对比,可以发现:SparkCL是通过自定义mapCL函数或者reduceCL函数来实现GPU并行。也就是说,sparkCL通过自定义mapCL/ reduceCL改写transformation。
其中mapCL/ reduceCL 里自定义funcX函数,这个函数在spark kernel实例化的时候,可以动态调用具体的mapParameter函数和mapReturnValue函数。mapParameter主要是set GPU参数,比如Range,mapReturnValue是执行具体的任务。
最后mapCL/ reduceCL 再调用spark的map(funX)和reduce(funX)
以下是mapCL代码:
public <R> JavaRDD<R> mapCL(final SparkKernel<T,R> kernel)
{
Function<T,R> funcX = new Function<T,R>()
{
@Override
public R call(T v1) throws Exception
{
final SparkKernel<T,R> cachedKernel = (SparkKernel<T, R>) SparkCLCache.getInstance().tryGetCachedKernelVersion(kernel);
cachedKernel.mapParameters(v1);
exclusiveExecKernel(cachedKernel);
return cachedKernel.mapReturnValue(v1);
}
};
return (JavaRDD<R>) m_data.map(funcX);
}