摘要:介紹實(shí)際上就是對(duì)用語言進(jìn)行了封裝,許多代碼都和一樣,這一點(diǎn)使得用過的可以非常快的上手,可以到查看源碼由于沒有指針,所以不得不用來獲取地址,這樣就感覺其實(shí)看起來比還要復(fù)雜開發(fā)環(huán)境搭建參考別人的文章完成開發(fā)環(huán)境搭建更新顯卡驅(qū)動(dòng)安裝驅(qū)動(dòng),應(yīng)該最新
JOCL 介紹
jocl實(shí)際上就是對(duì)opencl用java語言進(jìn)行了封裝,許多代碼都和opencl一樣,這一點(diǎn)使得用過opencl的可以非常快的上手,可以到github查看源碼
由于java沒有指針,所以jocl不得不用Pointer來獲取地址,這樣就感覺jocl其實(shí)看起來比opencl還要復(fù)雜
JOCL 開發(fā)環(huán)境搭建參考別人的文章https://my.oschina.net/qutter... 完成jocl開發(fā)環(huán)境搭建
更新顯卡驅(qū)動(dòng)
安裝opencl驅(qū)動(dòng),應(yīng)該最新版本的顯卡驅(qū)動(dòng)都是支持opencl的,可以用 GPU Caps Viewer 來測(cè)試,如果沒有,AMD的話可以到https://support.amd.com/en-us... 下載驅(qū)動(dòng)
下載opencl sdk
Inter https://software.intel.com/en...
AMD https://developer.amd.com/too...
Nvidia https://developer.nvidia.com/...
下載安裝jdk http://www.oracle.com/technet...,不要忘了設(shè)置環(huán)境變量
下載安裝eclipse http://www.eclipse.org/downlo...
下載jar包 http://www.jocl.org/downloads...,需要提取里面的相應(yīng)jar文件放到項(xiàng)目Referenced Libraries里面,把dll文件放到j(luò)dk安裝路徑/bin下
現(xiàn)在可以直接到官網(wǎng) http://www.jocl.org/samples/s... 找sample來運(yùn)行了
封裝JOCL原始的jocl就是對(duì)opencl的C語言的重寫,是比較麻煩的,下面給出封裝代碼
PackJocl.java
package jocl; import static org.jocl.CL.CL_CONTEXT_PLATFORM; import static org.jocl.CL.CL_DEVICE_TYPE_GPU; import static org.jocl.CL.CL_MEM_COPY_HOST_PTR; import static org.jocl.CL.CL_MEM_READ_ONLY; import static org.jocl.CL.CL_TRUE; import static org.jocl.CL.clBuildProgram; import static org.jocl.CL.clCreateBuffer; import static org.jocl.CL.clCreateCommandQueue; import static org.jocl.CL.clCreateContext; import static org.jocl.CL.clCreateKernel; import static org.jocl.CL.clCreateProgramWithSource; import static org.jocl.CL.clEnqueueNDRangeKernel; import static org.jocl.CL.clEnqueueReadBuffer; import static org.jocl.CL.clGetDeviceIDs; import static org.jocl.CL.clGetPlatformIDs; import static org.jocl.CL.clReleaseCommandQueue; import static org.jocl.CL.clReleaseContext; import static org.jocl.CL.clReleaseKernel; import static org.jocl.CL.clReleaseMemObject; import static org.jocl.CL.clReleaseProgram; import static org.jocl.CL.clSetKernelArg; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import org.jocl.CL; import org.jocl.Pointer; import org.jocl.Sizeof; import org.jocl.cl_command_queue; import org.jocl.cl_context; import org.jocl.cl_context_properties; import org.jocl.cl_device_id; import org.jocl.cl_kernel; import org.jocl.cl_mem; import org.jocl.cl_platform_id; import org.jocl.cl_program; /** * A small JOCL sample. */ public class PackJocl { cl_context context; // 上下文 cl_command_queue commandQueue; // 命令隊(duì)列 cl_program program; // 程序?qū)ο? cl_kernel kernel; // Kernel對(duì)象 cl_mem memObjects[]; // 內(nèi)存對(duì)象數(shù)組 /** * 讀取文件的內(nèi)容 * @param file 想要讀取的文件對(duì)象 * @return 返回文件內(nèi)容 */ public static String readCl(File file){ StringBuilder result = new StringBuilder(); try{ BufferedReader br = new BufferedReader(new FileReader(file));//構(gòu)造一個(gè)BufferedReader類來讀取文件 String s = null; while((s = br.readLine())!=null){//使用readLine方法,一次讀一行 result.append(System.lineSeparator()+s); } br.close(); }catch(Exception e){ e.printStackTrace(); } return result.toString(); } PackJocl(){ } /** * 加載平臺(tái)和驅(qū)動(dòng) * @param platformIdx 平臺(tái)index * @param deviceIdx 驅(qū)動(dòng)index */ @SuppressWarnings("deprecation") public void init(int platformIdx, int deviceIdx){ final int platformIndex = platformIdx; // 選擇哪個(gè)平臺(tái) final long deviceType = CL_DEVICE_TYPE_GPU; final int deviceIndex = deviceIdx; // Enable exceptions and subsequently omit error checks in this sample CL.setExceptionsEnabled(true); // Obtain the number of platforms int numPlatformsArray[] = new int[1]; clGetPlatformIDs(0, null, numPlatformsArray); int numPlatforms = numPlatformsArray[0]; // Obtain a platform ID cl_platform_id platforms[] = new cl_platform_id[numPlatforms]; clGetPlatformIDs(platforms.length, platforms, null); cl_platform_id platform = platforms[platformIndex]; // Initialize the context properties cl_context_properties contextProperties = new cl_context_properties(); contextProperties.addProperty(CL_CONTEXT_PLATFORM, platform); // Obtain the number of devices for the platform int numDevicesArray[] = new int[1]; clGetDeviceIDs(platform, deviceType, 0, null, numDevicesArray); int numDevices = numDevicesArray[0]; // Obtain a device ID cl_device_id devices[] = new cl_device_id[numDevices]; clGetDeviceIDs(platform, deviceType, numDevices, devices, null); cl_device_id device = devices[deviceIndex]; context = clCreateContext( contextProperties, 1, new cl_device_id[]{device}, null, null, null); // Create a command-queue for the selected device commandQueue = clCreateCommandQueue(context, device, 0, null); } /** * 創(chuàng)建Kernel * @param clName Kernel文件名 * @param funcName Kernel函數(shù)名 */ public void createKernel(String clName, String funcName){ program = clCreateProgramWithSource(context, 1, new String[]{ readCl(new File(clName)) }, null, null); // Build the program clBuildProgram(program, 0, null, null, null, null); // Create the kernel kernel = clCreateKernel(program, funcName, null); } /** * 創(chuàng)建Kernel * @param p 包含所有參數(shù)的指針數(shù)組 * @param n 分配內(nèi)存空間大小 */ public void setParameters(Pointer[] p, int n){ memObjects = new cl_mem[p.length]; for(int i = 0; i < p.length; i++){ memObjects[i] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * n, p[i], null); } for(int i = 0; i < p.length; i++){ clSetKernelArg(kernel, i, Sizeof.cl_mem, Pointer.to(memObjects[i])); } } /** * 執(zhí)行Kernel * @param dim 維數(shù) * @param global_work_size[] global_work_size * @param local_work_size[] local_work_size */ public void execute(int dim, long global_work_size[], long local_work_size[]){ // Execute the kernel clEnqueueNDRangeKernel(commandQueue, kernel, dim, null,global_work_size, local_work_size, 0, null, null); } /** * 把顯存里的計(jì)算結(jié)果取回內(nèi)存 * @param index 參數(shù)位置 * @param dstPointer 結(jié)果指針 * @param size 分配內(nèi)存空間大小 */ public void getData(int index, Pointer dstPointer, int size){ clEnqueueReadBuffer(commandQueue, memObjects[index], CL_TRUE, 0, size * Sizeof.cl_float, dstPointer, 0, null, null); } public void clear(){ clReleaseMemObject(memObjects[0]); clReleaseMemObject(memObjects[1]); clReleaseMemObject(memObjects[2]); clReleaseKernel(kernel); clReleaseProgram(program); clReleaseCommandQueue(commandQueue); clReleaseContext(context); } }
PackageTest.java
package jocl; import org.jocl.Pointer; public class PackageTest { public static void main(String args[]){ PackJocl jocl= new PackJocl(); // 初始化,第一個(gè)參數(shù)是平臺(tái)index,第二個(gè)參數(shù)是驅(qū)動(dòng)index jocl.init(1,0); // 創(chuàng)建內(nèi)核, 第一個(gè)是內(nèi)核文件名,第二個(gè)是內(nèi)核函數(shù)名 jocl.createKernel("E://kernel.cl", "add"); // 獲取測(cè)試數(shù)據(jù)并復(fù)制到顯存 int n = 10; float srcArrayA[] = new float[n]; float srcArrayB[] = new float[n]; float dstArray[] = new float[n]; for (int i=0; ikernel.cl 我是放在E盤根目錄下,所以PackageTest.java中寫的jocl.createKernel("E://kernel.cl", "add"); 你可以改成其他的
__kernel void add(__global const float *a, __global const float *b, __global float *c) { int gid = get_global_id(0); printf("%d ",gid); c[gid] = a[gid] + b[gid]; }運(yùn)行結(jié)果
第一次寫文章,希望可以幫助到你本文同步更新我的個(gè)人博客https://blog.yjqing.xin/jocl
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/76459.html
摘要:課程內(nèi)容以打造一款擁有天氣預(yù)報(bào)和簽到功能的小程序?yàn)橹骶€,從基礎(chǔ)知識(shí)到小程序運(yùn)行機(jī)制,從開發(fā)環(huán)境搭建到小程序云開發(fā)的接口使用調(diào)試上線,打通微信小程序開發(fā)全流程。 9 月 11 日,微信開發(fā)者工具新增小程序「云開發(fā)」功能。 showImg(https://segmentfault.com/img/bVbjQLW?w=1000&h=544); 大多數(shù)開發(fā)者在開發(fā)應(yīng)用時(shí)和部署服務(wù)時(shí),無論是選擇...
摘要:混合式開發(fā)做出的手機(jī)應(yīng)用無論在性能還是易用性方面都很接近原生應(yīng)用。下面介紹幾個(gè)流行的混合式開發(fā)框架。相比于其他開發(fā)框架,更加輕量,體積小巧。 目前混合式開發(fā)已經(jīng)逐漸成熟,混合式app開發(fā)只需要要求開發(fā)者會(huì)使用css和js前端代碼就可以實(shí)現(xiàn)手機(jī)app應(yīng)用的開發(fā),而不需要再去學(xué)習(xí)安卓或蘋果開發(fā),降低了app開發(fā)的門檻。混合式開發(fā)做出的手機(jī)應(yīng)用無論在性能還是易用性方面都很接近原生app應(yīng)用。...
摘要:混合式開發(fā)做出的手機(jī)應(yīng)用無論在性能還是易用性方面都很接近原生應(yīng)用。下面介紹幾個(gè)流行的混合式開發(fā)框架。相比于其他開發(fā)框架,更加輕量,體積小巧。 目前混合式開發(fā)已經(jīng)逐漸成熟,混合式app開發(fā)只需要要求開發(fā)者會(huì)使用css和js前端代碼就可以實(shí)現(xiàn)手機(jī)app應(yīng)用的開發(fā),而不需要再去學(xué)習(xí)安卓或蘋果開發(fā),降低了app開發(fā)的門檻。混合式開發(fā)做出的手機(jī)應(yīng)用無論在性能還是易用性方面都很接近原生app應(yīng)用。...
摘要:目前市場(chǎng)上主流的分為三種原生即和混合三種,相對(duì)應(yīng)的定制開發(fā)就是原生開發(fā)開發(fā)和混合開發(fā)。三混合原生開發(fā)混合開發(fā)開發(fā),是指在開發(fā)一款產(chǎn)品的時(shí)候,為了提高效率節(jié)省成本而利用原生與的開發(fā)技術(shù)的混合應(yīng)用。 目前市場(chǎng)上主流的APP分為三種:原生APP、Web APP(即HTML5)和混合APP三種,相對(duì)應(yīng)的定 制開發(fā)就是原生開發(fā)、H5開發(fā)和混合開發(fā)。那么這三種開發(fā)模式究竟有何不同呢?...
閱讀 3142·2021-10-08 10:04
閱讀 1080·2021-09-30 09:48
閱讀 3449·2021-09-22 10:53
閱讀 1664·2021-09-10 11:22
閱讀 1682·2021-09-06 15:00
閱讀 2142·2019-08-30 15:56
閱讀 704·2019-08-30 15:53
閱讀 2273·2019-08-30 13:04