国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JOCL 開發(fā)

jindong / 2513人閱讀

摘要:介紹實(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; i

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

相關(guān)文章

  • 小程序 · 云開發(fā)

    摘要:課程內(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í),無論是選擇...

    nanchen2251 評(píng)論0 收藏0
  • 混合式app開發(fā)框架

    摘要:混合式開發(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)用。...

    hot_pot_Leo 評(píng)論0 收藏0
  • 混合式app開發(fā)框架

    摘要:混合式開發(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)用。...

    darkbug 評(píng)論0 收藏0
  • 原生開發(fā)、H5開發(fā)和混合開發(fā)的區(qū)別

    摘要:目前市場(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ā)模式究竟有何不同呢?...

    褰辯話 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<