如何在 JavaCL 中结合 CPU 和 GPU?

Posted

技术标签:

【中文标题】如何在 JavaCL 中结合 CPU 和 GPU?【英文标题】:How to combine CPU and GPU in JavaCL? 【发布时间】:2013-06-29 02:28:08 【问题描述】:

我的笔记本电脑有 - 一个 CPU 内核 i5:Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz - 一张显卡:Intel(R) HD Graphics 4000 - 一张 Nvidia 卡(外置卡):GeForce GT 630M

但是当我尝试使用 JavaCL.createBestContext() 时,它看起来就像只使用一张卡 Intel HD Graphics。所以我尝试结合 3 : CPU 和 2 GPU 使用:

List<CLDevice> devices = new ArrayList<CLDevice>();

    // try to list all platform and devices
    for(CLPlatform platform : JavaCL.listPlatforms()) 
        //System.out.println(platform.getName());
        for (CLDevice device : platform.listAllDevices(true)) 
            System.out.println(device.getName().trim());
            devices.add(device);
        
    


CLDevice device1 = (CLDevice)devices.get(0);
CLDevice device2 = (CLDevice)devices.get(1);
CLDevice device3 = (CLDevice)devices.get(2);

CLContext context = JavaCL.createContext(null, device1, device2, device3);

但同时尝试使用 3 时出现错误。那么如何在 JavaCL 中编译 CPU 和 GPU 呢?因为我读到 OpenCL 是使用 CPU 和 GPU 支持并行编程的标准。所以如果我错过了什么,请告诉我。任何想法或答案将不胜感激。

谢谢, 应有尽有。

【问题讨论】:

【参考方案1】:

遗憾的是,这并不容易。在跨多个设备创建单个上下文时,所有设备都必须来自同一平台。创建包含 Intel CPU 和 GPU 的上下文应该可以工作,但 Nvidia GPU 必须在自己的上下文中(不同的平台,Nvidia 不是 Intel)。

以下是我处理这种情况的方法:我为每个设备创建一个上下文,并为每个上下文创建一个线程。每个线程获取我正在处理的数据的一部分并将其分派到其分配的 OpenCL 设备。通过这种方式,您可以混合使用 AMD 和 Nvidia 的 CPU、GPU 以及任何其他硬件。

跨线程进行负载平衡很重要,这样您就不会让较快的设备闲置等待较慢的设备赶上。

【讨论】:

感谢您的回答,我明白了您的想法,但您有任何示例吗?因为我真的是 OpenCL 的新手。 @DuyChung 我没有一个简单的例子给你。由于您是 OpenCL 的新手,我会警告您不要使用多 GPU 编程。您需要熟悉 Java 中的多线程、为并发编程设计的数据类型以及设备之间的负载平衡(如果您想看到任何加速) 其实同平台的CPU和GPU我都试过了,但是在不同的平台上我没试过,真的不知道怎么下手。但无论如何,谢谢你的信息。我会尝试找出解决方案。

以上是关于如何在 JavaCL 中结合 CPU 和 GPU?的主要内容,如果未能解决你的问题,请参考以下文章

如何将经过 gpu 训练的模型加载到 cpu 中?

Tensorflow 2:如何将执行从 GPU 切换到 CPU 并返回?

如何在linux下查看gpu信息

我如何与Metal沟通,以避免GPU和CPU之间的数据冲突

PyTorch 的 GPU 和 CPU 版本可以安装在同一个 Conda 环境中吗?

是否可以在 GPU 和 CPU 之间拆分 Cuda 作业?