【问题标题】:Parallelize LIBSVM on a multicore computer - Java在多核计算机上并行化 LIBSVM - Java
【发布时间】:2015-12-12 11:57:09
【问题描述】:

我一直在使用 java 版本的 libsvm 来解决许多数据挖掘问题。 然而我注意到即使我们有多核计算机,libsvm 只使用一个核心,它不会并行化问题。当我在常见问题解答中搜索时,有一个 c++ 解决方案[http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f432].现有的java类是这样的。

@Override
float[] get_Q( int i, int len )
{
    float[][] data = new float[1][];
    int start, j;
    if ( ( start = cache.get_data( i, data, len ) ) < len )
    {
        for ( j = start; j < len; j++ )
        {
            data[0][j] = ( float ) ( y[i] * y[j] * kernel_function( i, j ) );
        }

    }
    return data[0];
}

我在 java 中也使用了相同的概念 - 更改类 SVC_Q 中 get_Q 的 for 循环,如下所示。

    @Override
float[] get_Q( int i, int len )
{

    float[][] data = new float[1][];
    int start, j;
    if ( ( start = cache.get_data( i, data, len ) ) < len )
    {
        ExecutorService executorService = Executors.newFixedThreadPool( Runtime.getRuntime()
                .availableProcessors() ); // number of threads

        for ( j = start; j < len; j++ )
        {
            final int count = j;
            executorService.submit( new Runnable()
            {
                @Override
                public void run()
                {
                    data[0][count] = ( float ) ( y[i] * y[count] * kernel_function( i, count ) );
                }
            } );

        }
        executorService.shutdown();

    }
    return data[0];
}

即使现在更改后它使用了我机器中的所有内核,但结果却在下降。新测试集的正确分类实例的百分比从 78% 下降到 58%。训练时间也没有减少。所以很明显我做的不对。 是否有适当的方法来并行化 libsvm?我在代码中犯了什么错误?

【问题讨论】:

    标签: java parallel-processing machine-learning libsvm


    【解决方案1】:

    如果您不知道如何编写多线程/并行代码,请避免尝试并行化任何代码。

    在这种特殊情况下,you need to wait for the executor to finish all of its jobs. 在您返回结果之前。

    但是,这并不意味着 kernel_function 方法是线程安全的。

    【讨论】:

    • 谢谢,这解决了准确性问题,即使执行时间保持不变,所以我猜 kernel_function 不是线程安全的。但我想知道为什么FAQ有这样的c ++解决方案,#pragma omp parallel for private(j) schedule(guided) for(j=start;j
    • omp pgrama 所做的和您所写的并不是 100% 等效的。您的代码在这里有很大的开销,为每个元素启动一个工作。这就是为什么如果您对编写多线程代码一无所知,我建议您不要尝试并行化代码。我建议您在自行尝试进行此类更改之前阅读此内容 (amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/…)。
    • 线程安全与加速无关,方法/变量是否安全可以同时从多个线程使用。
    • 那么 C++ 代码的等效 java 代码是什么 - #pragma omp parallel for private(j) schedule(guided) for(j=start;j
    • @raff 请不要阻止初学者学习并行计算。您的回答建议没有人在不知道如何编写并行代码的情况下尝试编写并行代码,这实际上阻碍了学习并行计算的最简单途径。是的,他们可能会在开始时编写一些糟糕的代码,但将他们引导到适当的资源或直接回答他们的问题而不是责备他们尝试学习新东西会更具建设性。
    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 2017-11-07
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多