如何让我的java程序在GPU上运行?如何更改我的程序可以加速? [英] How can I get my java program running on GPU ?How do I change my program can be accelerated?

查看:265
本文介绍了如何让我的java程序在GPU上运行?如何更改我的程序可以加速?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了一个由几个类组成的程序,但计算速度太慢(程序用粗体表示),我希望让我的java程序在GPU上运行以加速计算,或者是否有其他方法可以加速运行速度,如何更改我的代码?
程序的计算如下:

I wrote a program which constituted by several class,but the calculation is too slow(Program in bold), I hope get my java program running on GPU to speed up the computation,or is there another way to speed up the running speed,How do I change my code? Calculation of the program are as follows:

public class ComputeThreadPool {
  public static double[][] distance = new double[40][8];
  public static HashMap<String,Double> simMap = new HashMap<String,Double>();
static class WorkThread implements Runnable {
    private Map<String, Double> testWordTFMap;
    private Map<String, Double> trainWordTFMap;
    private Map<String, double[]> words;
    private String trainname;

    public WorkThread(Map<String, Double> map1, Map<String, Double> map2, Map<String, double[]> words,String trainname) {
        this.testWordTFMap = map1;
        this.trainWordTFMap = map2;
        this.words = words;
        this.trainname=trainname;
    }

    @Override
    public void run() {
         System.out.println(Thread.currentThread().getName()+" Start. Command = "+command);
        double mul = 0, testAbs = 0, trainAbs = 0;

        WordsSimilarity computeS = new WordsSimilarity();
        double wf = 0;
        Set<Map.Entry<String, Double>> testWordTFMapSet = testWordTFMap.entrySet();
        for (Iterator<Map.Entry<String, Double>> it = testWordTFMapSet.iterator(); it.hasNext(); ) {
            Map.Entry<String, Double> me = it.next();
            Set<Map.Entry<String, Double>> trainWordTFMapSet = trainWordTFMap.entrySet();
            ***for (Iterator<Map.Entry<String, Double>> it2 = trainWordTFMapSet.iterator(); it2.hasNext(); ) {
                Map.Entry<String, Double> me2 = it2.next();              
                    wf = computeS.similarity(me.getKey(), me2.getKey(), words);
                if (wf > 0.45)
                    mul += wf * me.getValue() * me2.getValue();
            }
        }***

        for (Iterator<Map.Entry<String, Double>> it3 = testWordTFMapSet.iterator(); it3.hasNext(); ) {
            Map.Entry<String, Double> me3 = it3.next();
            testAbs += me3.getValue() * me3.getValue();
        }
        testAbs = Math.sqrt(testAbs);
        Set<Map.Entry<String, Double>> trainWordTFMapSet = trainWordTFMap.entrySet();
        for (Iterator<Map.Entry<String, Double>> it4 = trainWordTFMapSet.iterator(); it4.hasNext(); ) {
            Map.Entry<String, Double> me4 = it4.next();
            trainAbs += me4.getValue() * me4.getValue();
        }

        trainAbs = Math.sqrt(trainAbs);
        simMap.put(trainname,mul / (testAbs * trainAbs));
        System.out.println(Thread.currentThread().getName() + " Start.     " );
        processCommand();
        System.out.println(Thread.currentThread().getName() + " End.");
    }
    private void processCommand() {
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public static HashMap<String,Double> main(Map<String, Double> testWordTFMap,Map<String, TreeMap<String, Double>> trainFileNameWordTFMap,Map<String, double[]> words) {
    int num=0;
    ExecutorService executor = Executors.newFixedThreadPool(6);
    Set<Map.Entry<String,TreeMap<String,Double>>> trainFileNameWordTFMapSet = trainFileNameWordTFMap.entrySet();
    for(Iterator<Map.Entry<String,TreeMap<String,Double>>> it = trainFileNameWordTFMapSet.iterator(); it.hasNext();){
        Map.Entry<String, TreeMap<String,Double>> me = it.next();
        num=num++;
        Runnable worker = new WorkThread(testWordTFMap,me.getValue(),words,me.getKey());
        executor.execute(worker);
    }
    executor.shutdown();
    while (!executor.isTerminated()) {
    }
    System.out.println("Finished all threads");

    return simMap;
}

}

wf的计算方法如下:

wf is calculated as follows:

    public static double similarity(String word1, String word2,Map<String, double[]> words) {

    double[] count1=words.get(word1);
    double[] count2=words.get(word2);
    double sum=0;
    double Abs1=0;
    double Abs2=0;
    if(count1 == null || count2 == null) {
        return 0;
    }
    for (int c = 0; c < count1.length; c++) {
        sum += count1[c] * count2[c];
        Abs1 += count1[c] * count1[c];
        Abs2 += count2[c] * count2[c];
    }
    return sum / (Abs1 * Abs2);

}                                                                                           


推荐答案

你会需要找到在GPU上运行的JVM的实现,或者以GPU为目标的运行时环境/ shell,您可以在其中运行标准JVM;但除非JVM是为GPU构建的,否则你可能会或可能不会获得性能提升。

You would need to find an implementation of the JVM that runs on the GPU or a runtime environment/shell that targets the GPU in which you can run the standard JVM; but unless the JVM is built for the GPU you may or may not get performance gains.

但是我会说,你应该能够在代码中找到优化。比如使用增强的for循环。除了计算单词相似性之外,似乎没有那么多应该导致过多的运行时间。

However I would say, you should be able to find optimisations within the code first. Such as using enhanced for loops. Other than the compute word similarity there doesn't seem to much there that should be causing excessive run time.

这篇关于如何让我的java程序在GPU上运行?如何更改我的程序可以加速?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆