Package org.trifort.rootbeer.generate.opencl.tweaks

Source Code of org.trifort.rootbeer.generate.opencl.tweaks.CudaTweaks

/*
* Copyright 2012 Phil Pratt-Szeliga and other contributors
* http://chirrup.org/
*
* See the file LICENSE for copying permission.
*/

package org.trifort.rootbeer.generate.opencl.tweaks;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

import org.trifort.rootbeer.compressor.Compressor;
import org.trifort.rootbeer.configuration.Configuration;
import org.trifort.rootbeer.configuration.RootbeerPaths;
import org.trifort.rootbeer.deadmethods.DeadMethods;
import org.trifort.rootbeer.generate.opencl.tweaks.GencodeOptions.CompileArchitecture;
import org.trifort.rootbeer.util.CompilerRunner;
import org.trifort.rootbeer.util.CudaPath;
import org.trifort.rootbeer.util.WindowsCompile;

public class CudaTweaks extends Tweaks {

  @Override
  public String getGlobalAddressSpaceQualifier() {
    return "";
  }

  @Override
  public String getUnixHeaderPath() {
    return "/org/trifort/rootbeer/generate/opencl/CudaHeader.c";
  }
 
  @Override
  public String getWindowsHeaderPath() {
    return "/org/trifort/rootbeer/generate/opencl/CudaHeader.c";
  }
 
  @Override
  public String getBothHeaderPath() {
    return null;
  }
 
  @Override
  public String getBarrierPath() {
    return null;
  }
 
  @Override
  public String getGarbageCollectorPath() {
    return "/org/trifort/rootbeer/generate/opencl/GarbageCollector.c";
  }

  @Override
  public String getUnixKernelPath() {
    return "/org/trifort/rootbeer/generate/opencl/CudaKernel.c";
  }
 
  @Override
  public String getWindowsKernelPath() {
    return "/org/trifort/rootbeer/generate/opencl/CudaKernel.c";
  }

  @Override
  public String getBothKernelPath() {
    return null;
  }
     
  /**
   * Compiles CUDA code.
   *
   * @param cuda_code string containing code.
   * @param compileArch determine if we need to build 32bit, 64bit or both.
   * @return an array containing compilation results. You can use <tt>is32Bit()</tt> on each element
   * to determine if it is 32 bit or 64bit code. If compilation for an architecture fails, only the
   * offending element is returned.
   */
  public CompileResult[] compileProgram(String cuda_code, CompileArchitecture compileArch) {
    PrintWriter writer;
    try {
      writer = new PrintWriter(RootbeerPaths.v().getRootbeerHome() + "pre_dead.cu");
      writer.println(cuda_code);
      writer.flush();
      writer.close();

      DeadMethods dead_methods = new DeadMethods();
      dead_methods.parseString(cuda_code);
      cuda_code = dead_methods.getResult();

      //Compressor compressor = new Compressor();
      //cuda_code = compressor.compress(cuda_code);

      File generated = new File(RootbeerPaths.v().getRootbeerHome() + "generated.cu");
      writer = new PrintWriter(generated);
      writer.println(cuda_code.toString());
      writer.flush();
      writer.close();

      CudaPath cuda_path = new CudaPath();
      GencodeOptions options_gen = new GencodeOptions();
      String gencode_options = options_gen.getOptions();
     
      ParallelCompile parallel_compile = new ParallelCompile();
      return parallel_compile.compile(generated, cuda_path, gencode_options, compileArch);
    } catch (Exception ex) {
      throw new RuntimeException("Failed to compile cuda code.", ex);
    }
  }

  @Override
  public String getDeviceFunctionQualifier() {
    return "__device__";
  }

}
TOP

Related Classes of org.trifort.rootbeer.generate.opencl.tweaks.CudaTweaks

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.