<!--
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
-->

<root>
    <!-- local fs tmp working directory-->
    <sysds.localtmpdir>/tmp/systemds</sysds.localtmpdir>

    <!-- hdfs tmp working directory--> 
    <sysds.scratch>scratch_space</sysds.scratch>

    <!-- compiler optimization level, valid values: 0 | 1 | 2 | 3 | 4, default: 2 -->
    <sysds.optlevel>2</sysds.optlevel>
	
    <!-- default block dim for binary block files -->
    <sysds.defaultblocksize>1000</sysds.defaultblocksize>
 
    <!-- enables multi-threaded operations in singlenode control program -->
    <sysds.cp.parallel.ops>true</sysds.cp.parallel.ops>
    
    <!-- enables multi-threaded read/write in singlenode control program -->
    <sysds.cp.parallel.io>true</sysds.cp.parallel.io>
    
    <!-- enables compressed linear algebra, experimental feature -->
    <sysds.compressed.linalg>auto</sysds.compressed.linalg>
    
    <!-- enables operator fusion via code generation, experimental feature -->
    <sysds.codegen.enabled>false</sysds.codegen.enabled>
    
    <!-- set the codegen java compiler (auto, janino, javac) -->
    <sysds.codegen.compiler>auto</sysds.codegen.compiler>

    <!-- set the codegen optimizer (fuse_all, fuse_no_redundancy, fuse_cost_based_v2) -->
    <sysds.codegen.compiler>fuse_cost_based_v2</sysds.codegen.compiler>
    
    <!-- if codegen.enabled, enables source code caching of fused operators -->
    <sysds.codegen.plancache>true</sysds.codegen.plancache>
    
    <!-- if codegen.enabled, compile literals as constants: 1..heuristic, 2..always -->
    <sysds.codegen.literals>1</sysds.codegen.literals>
    
    <!-- enables native blas for matrix multiplication and convolution, experimental feature (options: auto, mkl, openblas, none) -->
    <sysds.native.blas>none</sysds.native.blas>
 
    <!-- custom directory where BLAS libraries are available, experimental feature (options: absolute directory path or none). If set to none, we use standard LD_LIBRARY_PATH. -->
    <sysds.native.blas.directory>none</sysds.native.blas.directory>
   
    <!-- sets the GPUs to use per process, -1 for all GPUs, a specific GPU number (5), a range (eg: 0-2) or a comma separated list (eg: 0,2,4)-->
    <sysds.gpu.availableGPUs>-1</sysds.gpu.availableGPUs>
    
    <!-- whether to synchronize GPUs after every GPU instruction -->
    <sysds.gpu.sync.postProcess>false</sysds.gpu.sync.postProcess>
    
    <!-- whether to perform eager CUDA free on rmvar instruction -->
    <sysds.gpu.eager.cudaFree>false</sysds.gpu.eager.cudaFree>
    
    <!-- Developer flag used to debug GPU memory leaks. This has huge performance overhead and should be only turned on for debugging purposes.  -->
    <sysds.gpu.print.memoryInfo>false</sysds.gpu.print.memoryInfo>
   
    <!-- the floating point precision. supported values are double, single -->
    <sysds.floating.point.precision>double</sysds.floating.point.precision>
    
    <!-- the eviction policy for the GPU bufferpool. Supported values are lru, mru, lfu, min_evict, align_memory -->
    <sysds.gpu.eviction.policy>min_evict</sysds.gpu.eviction.policy>
    
    <!-- maximum wrap length for instruction and miscellaneous timer column of statistics -->
    <sysds.stats.maxWrapLength>30</sysds.stats.maxWrapLength>
   
    <!-- Advanced optimization: fraction of driver memory to use for GPU shadow buffer. This optimization is ignored for double precision. 
    By default, it is disabled (hence set to 0.0). If you intend to train network larger than GPU memory size, consider using single precision and setting this to 0.1 -->
    <sysds.gpu.eviction.shadow.bufferSize>0.0</sysds.gpu.eviction.shadow.bufferSize>

    <!-- Fraction of available GPU memory to use. This is similar to TensorFlow's per_process_gpu_memory_fraction configuration property. (default: 0.9) -->
    <sysds.gpu.memory.util.factor>0.9</sysds.gpu.memory.util.factor>
    
    <!-- Allocator to use to allocate GPU device memory. Supported values are cuda, unified_memory (default: cuda) -->
    <sysds.gpu.memory.allocator>cuda</sysds.gpu.memory.allocator>
</root>