..  _api_guide_compiled_program:

################
CompiledProgram
################

:ref:`cn_api_fluid_CompiledProgram` 用于把程序转化为不同的优化组合。例如，你可以使用with_data_parallel将程序转化为数据并行程序，使其能够运行在多个设备上。 


.. code-block:: python

    # 注释：
    #   - 如果你想在ParallelExecutor中指定用于运行的GPU卡，需要在环境中定义
    #     CUDA_VISIBLE_DEVICES
    #   - 如果你想在ParallelExecutor中使用多CPU来运行程序，需要在环境中定义
    #     CPU_NUM
    
    # 首先创建Executor。
    place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
    exe = fluid.Executor(place)
    # 运行启动程序仅一次。
    exe.run(fluid.default_startup_program())
    
    # 直接运行主程序，无需编译。
    loss = exe.run(fluid.default_main_program(),
                    feed=feed_dict,
                    fetch_list=[loss.name])
    
    # 或者编译程序后用数据并行方式运行模型。
    exec_strategy = fluid.ExecutionStrategy()
    exec_strategy.num_threads = dev_count * 4 # the size of thread pool.
    build_strategy = fluid.BuildStrategy()
    build_strategy.memory_optimize = True if memory_opt else False  
    compiled_prog = compiler.CompiledProgram(
        fluid.default_main_program()).with_data_parallel(
            loss_name=loss.name,
            build_strategy=build_strategy,
            exec_strategy=exec_strategy)
    loss, = exe.run(compiled_prog,
                    feed=feed_dict,
                    fetch_list=[loss.name])
                    
- 相关API :

 - :ref:`cn_api_fluid_CompiledProgram`
