BOAST 2.0.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/BOAST.gemspec +4 -3
- data/lib/BOAST.rb +1 -0
- data/lib/BOAST/Language/Arithmetic.rb +5 -1
- data/lib/BOAST/Language/BOAST_OpenCL.rb +6 -6
- data/lib/BOAST/Language/Case.rb +11 -11
- data/lib/BOAST/Language/Comment.rb +2 -2
- data/lib/BOAST/Language/Config.rb +5 -5
- data/lib/BOAST/Language/DataTypes.rb +31 -29
- data/lib/BOAST/Language/Expression.rb +16 -16
- data/lib/BOAST/Language/For.rb +6 -6
- data/lib/BOAST/Language/FuncCall.rb +7 -7
- data/lib/BOAST/Language/HighLevelOperators.rb +6 -6
- data/lib/BOAST/Language/If.rb +7 -7
- data/lib/BOAST/Language/Index.rb +31 -31
- data/lib/BOAST/Language/Intrinsics.rb +27 -27
- data/lib/BOAST/Language/OpenMP.rb +19 -19
- data/lib/BOAST/Language/Operators.rb +62 -50
- data/lib/BOAST/Language/Pragma.rb +4 -4
- data/lib/BOAST/Language/Procedure.rb +47 -47
- data/lib/BOAST/Language/Slice.rb +14 -14
- data/lib/BOAST/Language/State.rb +1 -1
- data/lib/BOAST/Language/Transitions.rb +1 -1
- data/lib/BOAST/Language/Variable.rb +83 -90
- data/lib/BOAST/Language/While.rb +4 -4
- data/lib/BOAST/Optimization/Optimization.rb +61 -37
- data/lib/BOAST/Runtime/AffinityProbe.rb +99 -15
- data/lib/BOAST/Runtime/CRuntime.rb +18 -6
- data/lib/BOAST/Runtime/CUDARuntime.rb +11 -7
- data/lib/BOAST/Runtime/CoExecute.rb +77 -0
- data/lib/BOAST/Runtime/CompiledRuntime.rb +274 -110
- data/lib/BOAST/Runtime/Compilers.rb +15 -15
- data/lib/BOAST/Runtime/Config.rb +3 -0
- data/lib/BOAST/Runtime/EnergyProbe.rb +86 -71
- data/lib/BOAST/Runtime/FFIRuntime.rb +1 -1
- data/lib/BOAST/Runtime/FORTRANRuntime.rb +15 -5
- data/lib/BOAST/Runtime/MPPARuntime.rb +30 -19
- data/lib/BOAST/Runtime/OpenCLRuntime.rb +2 -2
- data/lib/BOAST/Runtime/Probe.rb +122 -41
- metadata +29 -8
| @@ -38,7 +38,7 @@ module BOAST | |
| 38 38 | 
             
              class BasicBinaryOperator < Operator
         | 
| 39 39 |  | 
| 40 40 | 
             
                def BasicBinaryOperator.string(arg1, arg2, return_type)
         | 
| 41 | 
            -
                  if lang == C and (arg1. | 
| 41 | 
            +
                  if lang == C and (arg1.instance_of? Variable and arg2.instance_of? Variable) and (arg1.type.vector_length > 1 or arg2.type.vector_length > 1) then
         | 
| 42 42 | 
             
                    instruction = intrinsics(intr_symbol, return_type.type)
         | 
| 43 43 | 
             
                    a1 = convert(arg1, return_type.type)
         | 
| 44 44 | 
             
                    a2 = convert(arg2, return_type.type)
         | 
| @@ -357,7 +357,7 @@ module BOAST | |
| 357 357 | 
             
                  elsif values.kind_of?(Array) then
         | 
| 358 358 | 
             
                    raise OperatorError, "Wrong number of mask values (#{values.length} for #{length})!" if length and values.length != length
         | 
| 359 359 | 
             
                    s = "0x"
         | 
| 360 | 
            -
                    s  | 
| 360 | 
            +
                    s << values.collect { |v| v != 0 ? 1 : 0 }.reverse.join
         | 
| 361 361 | 
             
                    @value = Int( s, :signed => false, :size => values.length / 8 + ( values.length % 8 > 0 ? 1 : 0 ), :constant => s )
         | 
| 362 362 | 
             
                    @length = values.length
         | 
| 363 363 | 
             
                    @pos_values = values.reject { |e| e == 0 }.length
         | 
| @@ -434,7 +434,7 @@ module BOAST | |
| 434 434 | 
             
                      if lang == CL then
         | 
| 435 435 | 
             
                        return @return_type.copy("(#{@return_type.type.decl})( #{eff_src} )", DISCARD_OPTIONS) if lang == CL
         | 
| 436 436 | 
             
                      end
         | 
| 437 | 
            -
                      if (@source.is_a?(Numeric) and @source == 0) or (@source. | 
| 437 | 
            +
                      if (@source.is_a?(Numeric) and @source == 0) or (@source.instance_of? Variable and @source.constant == 0) then
         | 
| 438 438 | 
             
                        begin
         | 
| 439 439 | 
             
                          instruction = intrinsics(:SETZERO, @return_type.type)
         | 
| 440 440 | 
             
                          return @return_type.copy("#{instruction}( )", DISCARD_OPTIONS) if instruction
         | 
| @@ -464,9 +464,9 @@ module BOAST | |
| 464 464 |  | 
| 465 465 | 
             
                def pr
         | 
| 466 466 | 
             
                  s=""
         | 
| 467 | 
            -
                  s  | 
| 468 | 
            -
                  s  | 
| 469 | 
            -
                  s  | 
| 467 | 
            +
                  s << indent
         | 
| 468 | 
            +
                  s << to_s
         | 
| 469 | 
            +
                  s << ";" if [C, CL, CUDA].include?( lang )
         | 
| 470 470 | 
             
                  output.puts s
         | 
| 471 471 | 
             
                  return self
         | 
| 472 472 | 
             
                end
         | 
| @@ -500,9 +500,9 @@ module BOAST | |
| 500 500 | 
             
                  tar = @target.to_var if @target.respond_to?(:to_var)
         | 
| 501 501 | 
             
                  src = @source
         | 
| 502 502 | 
             
                  src = @source.to_var if @source.respond_to?(:to_var)
         | 
| 503 | 
            -
                  if tar. | 
| 503 | 
            +
                  if tar.instance_of? Variable and tar.type.vector_length > 1 then
         | 
| 504 504 | 
             
                    return @target.copy("#{@target} = #{Load(@source, @target, @options)}", DISCARD_OPTIONS)
         | 
| 505 | 
            -
                  elsif src. | 
| 505 | 
            +
                  elsif src.instance_of? Variable and src.type.vector_length > 1 then
         | 
| 506 506 | 
             
                    r_t, _ = transition(tar, src, Affectation)
         | 
| 507 507 | 
             
                    opts = @options.clone
         | 
| 508 508 | 
             
                    opts[:store_type] = r_t
         | 
| @@ -517,9 +517,9 @@ module BOAST | |
| 517 517 |  | 
| 518 518 | 
             
                def pr
         | 
| 519 519 | 
             
                  s=""
         | 
| 520 | 
            -
                  s  | 
| 521 | 
            -
                  s  | 
| 522 | 
            -
                  s  | 
| 520 | 
            +
                  s << indent
         | 
| 521 | 
            +
                  s << to_s
         | 
| 522 | 
            +
                  s << ";" if [C, CL, CUDA].include?( lang )
         | 
| 523 523 | 
             
                  output.puts s
         | 
| 524 524 | 
             
                  return self
         | 
| 525 525 | 
             
                end
         | 
| @@ -555,7 +555,7 @@ module BOAST | |
| 555 555 | 
             
                  if lang == C or lang == CL then
         | 
| 556 556 | 
             
                    if @source.kind_of?(Array) then
         | 
| 557 557 | 
             
                      return Set(@source, @return_type).to_var
         | 
| 558 | 
            -
                    elsif @source. | 
| 558 | 
            +
                    elsif @source.instance_of? Variable or @source.respond_to?(:to_var) then
         | 
| 559 559 | 
             
                      src_var = source.to_var
         | 
| 560 560 | 
             
                      if src_var.type == @return_type.type then
         | 
| 561 561 | 
             
                        return src_var
         | 
| @@ -574,14 +574,14 @@ module BOAST | |
| 574 574 | 
             
                        if mask and not mask.full? then
         | 
| 575 575 | 
             
                          return Set(0, @return_type) if @zero and mask.empty?
         | 
| 576 576 | 
             
                          return @return_type if mask.empty?
         | 
| 577 | 
            -
                          sym  | 
| 578 | 
            -
                          sym  | 
| 579 | 
            -
                          sym  | 
| 577 | 
            +
                          sym << "MASK"
         | 
| 578 | 
            +
                          sym << "Z" if @zero
         | 
| 579 | 
            +
                          sym << "_"
         | 
| 580 580 | 
             
                        end
         | 
| 581 581 | 
             
                        if src_var.alignment and @return_type.type.total_size and ( src_var.alignment % @return_type.type.total_size ) == 0 then
         | 
| 582 | 
            -
                          sym  | 
| 582 | 
            +
                          sym << "LOADA"
         | 
| 583 583 | 
             
                        else
         | 
| 584 | 
            -
                          sym  | 
| 584 | 
            +
                          sym << "LOAD"
         | 
| 585 585 | 
             
                        end
         | 
| 586 586 | 
             
                        instruction = intrinsics( sym.to_sym, @return_type.type)
         | 
| 587 587 | 
             
                        if mask and not mask.full? then
         | 
| @@ -596,7 +596,7 @@ module BOAST | |
| 596 596 | 
             
                  elsif lang == FORTRAN then
         | 
| 597 597 | 
             
                    if @source.kind_of?(Array) then
         | 
| 598 598 | 
             
                      return Set(@source, @return_type).to_var
         | 
| 599 | 
            -
                    elsif @source. | 
| 599 | 
            +
                    elsif @source.instance_of? Variable or @source.respond_to?(:to_var) then
         | 
| 600 600 | 
             
                      if @source.to_var.type == @return_type.type then
         | 
| 601 601 | 
             
                        return @source.to_var
         | 
| 602 602 | 
             
                      elsif @source.kind_of?(Index) and @return_type.type.vector_length > 1 then
         | 
| @@ -613,9 +613,9 @@ module BOAST | |
| 613 613 |  | 
| 614 614 | 
             
                def pr
         | 
| 615 615 | 
             
                  s=""
         | 
| 616 | 
            -
                  s  | 
| 617 | 
            -
                  s  | 
| 618 | 
            -
                  s  | 
| 616 | 
            +
                  s << indent
         | 
| 617 | 
            +
                  s << to_s
         | 
| 618 | 
            +
                  s << ";" if [C, CL, CUDA].include?( lang )
         | 
| 619 619 | 
             
                  output.puts s
         | 
| 620 620 | 
             
                  return self
         | 
| 621 621 | 
             
                end
         | 
| @@ -667,7 +667,7 @@ module BOAST | |
| 667 667 | 
             
                    src = src[1..-1]
         | 
| 668 668 | 
             
                  end
         | 
| 669 669 | 
             
                  p_type = type.copy(:vector_length => 1)
         | 
| 670 | 
            -
                  s  | 
| 670 | 
            +
                  s << "#{instruction}( (#{p_type.decl} * ) #{src}, #{get_mask} )"
         | 
| 671 671 | 
             
                  return @return_type.copy( s, DISCARD_OPTIONS)
         | 
| 672 672 | 
             
                end
         | 
| 673 673 |  | 
| @@ -677,9 +677,9 @@ module BOAST | |
| 677 677 |  | 
| 678 678 | 
             
                def pr
         | 
| 679 679 | 
             
                  s=""
         | 
| 680 | 
            -
                  s  | 
| 681 | 
            -
                  s  | 
| 682 | 
            -
                  s  | 
| 680 | 
            +
                  s << indent
         | 
| 681 | 
            +
                  s << to_s
         | 
| 682 | 
            +
                  s << ";" if [C, CL, CUDA].include?( lang )
         | 
| 683 683 | 
             
                  output.puts s
         | 
| 684 684 | 
             
                  return self
         | 
| 685 685 | 
             
                end
         | 
| @@ -725,11 +725,11 @@ module BOAST | |
| 725 725 | 
             
                    mask = nil
         | 
| 726 726 | 
             
                    mask = Mask(@mask, :length => @store_type.type.vector_length) if @mask
         | 
| 727 727 | 
             
                    return "" if mask and mask.empty?
         | 
| 728 | 
            -
                    sym  | 
| 728 | 
            +
                    sym << "MASK_" if mask and not mask.full?
         | 
| 729 729 | 
             
                    if @dest.alignment and type.total_size and ( @dest.alignment % type.total_size ) == 0 then
         | 
| 730 | 
            -
                      sym  | 
| 730 | 
            +
                      sym << "STOREA"
         | 
| 731 731 | 
             
                    else
         | 
| 732 | 
            -
                      sym  | 
| 732 | 
            +
                      sym << "STORE"
         | 
| 733 733 | 
             
                    end
         | 
| 734 734 | 
             
                    instruction = intrinsics(sym.to_sym, type)
         | 
| 735 735 | 
             
                    p_type = type.copy(:vector_length => 1)
         | 
| @@ -746,9 +746,9 @@ module BOAST | |
| 746 746 |  | 
| 747 747 | 
             
                def pr
         | 
| 748 748 | 
             
                  s=""
         | 
| 749 | 
            -
                  s  | 
| 750 | 
            -
                  s  | 
| 751 | 
            -
                  s  | 
| 749 | 
            +
                  s << indent
         | 
| 750 | 
            +
                  s << to_s
         | 
| 751 | 
            +
                  s << ";" if [C, CL, CUDA].include?( lang )
         | 
| 752 752 | 
             
                  output.puts s
         | 
| 753 753 | 
             
                  return self
         | 
| 754 754 | 
             
                end
         | 
| @@ -799,16 +799,16 @@ module BOAST | |
| 799 799 | 
             
                    dst = dst[1..-1]
         | 
| 800 800 | 
             
                  end
         | 
| 801 801 | 
             
                  p_type = type.copy(:vector_length => 1)
         | 
| 802 | 
            -
                  return s  | 
| 802 | 
            +
                  return s << "#{instruction}( (#{p_type.decl} * ) #{dst}, #{get_mask}, #{Operator.convert(@source, type)} )"
         | 
| 803 803 | 
             
                end
         | 
| 804 804 |  | 
| 805 805 | 
             
                def pr
         | 
| 806 806 | 
             
                  ss = to_s
         | 
| 807 807 | 
             
                  if ss then
         | 
| 808 808 | 
             
                    s=""
         | 
| 809 | 
            -
                    s  | 
| 810 | 
            -
                    s  | 
| 811 | 
            -
                    s  | 
| 809 | 
            +
                    s << indent
         | 
| 810 | 
            +
                    s << ss
         | 
| 811 | 
            +
                    s << ";" if [C, CL, CUDA].include?( lang )
         | 
| 812 812 | 
             
                    output.puts s
         | 
| 813 813 | 
             
                  end
         | 
| 814 814 | 
             
                  return self
         | 
| @@ -877,9 +877,9 @@ module BOAST | |
| 877 877 |  | 
| 878 878 | 
             
                def pr
         | 
| 879 879 | 
             
                  s=""
         | 
| 880 | 
            -
                  s  | 
| 881 | 
            -
                  s  | 
| 882 | 
            -
                  s  | 
| 880 | 
            +
                  s << indent
         | 
| 881 | 
            +
                  s << to_s
         | 
| 882 | 
            +
                  s << ";" if [C, CL, CUDA].include?( lang )
         | 
| 883 883 | 
             
                  output.puts s
         | 
| 884 884 | 
             
                  return self
         | 
| 885 885 | 
             
                end
         | 
| @@ -948,9 +948,9 @@ module BOAST | |
| 948 948 |  | 
| 949 949 | 
             
                def pr
         | 
| 950 950 | 
             
                  s=""
         | 
| 951 | 
            -
                  s  | 
| 952 | 
            -
                  s  | 
| 953 | 
            -
                  s  | 
| 951 | 
            +
                  s << indent
         | 
| 952 | 
            +
                  s << to_s
         | 
| 953 | 
            +
                  s << ";" if [C, CL, CUDA].include?( lang )
         | 
| 954 954 | 
             
                  output.puts s
         | 
| 955 955 | 
             
                  return self
         | 
| 956 956 | 
             
                end
         | 
| @@ -982,9 +982,9 @@ module BOAST | |
| 982 982 |  | 
| 983 983 | 
             
                def pr
         | 
| 984 984 | 
             
                  s=""
         | 
| 985 | 
            -
                  s  | 
| 986 | 
            -
                  s  | 
| 987 | 
            -
                  s  | 
| 985 | 
            +
                  s << indent
         | 
| 986 | 
            +
                  s << to_s
         | 
| 987 | 
            +
                  s << ";" if [C, CL, CUDA].include?( lang )
         | 
| 988 988 | 
             
                  output.puts s
         | 
| 989 989 | 
             
                  return self
         | 
| 990 990 | 
             
                end
         | 
| @@ -1002,7 +1002,7 @@ module BOAST | |
| 1002 1002 | 
             
                def to_s_fortran
         | 
| 1003 1003 | 
             
                  op1, op2 = op_to_var
         | 
| 1004 1004 | 
             
                  if @return_type and @return_type.type.kind_of?(Real) and ( not op1.type.kind_of?(Real) or not op2.type.kind_of?(Real) ) then
         | 
| 1005 | 
            -
                    return "modulo(real(#{op1}, #{@return_type.type.size}), #{op2})"  | 
| 1005 | 
            +
                    return "modulo(real(#{op1}, #{@return_type.type.size}), #{op2})" unless op1.type.kind_of?(Real)
         | 
| 1006 1006 | 
             
                    return "modulo(#{op1}, real(#{op2}, #{@return_type.type.size}))"
         | 
| 1007 1007 | 
             
                  else
         | 
| 1008 1008 | 
             
                    return "modulo(#{op1}, #{op2})"
         | 
| @@ -1013,12 +1013,24 @@ module BOAST | |
| 1013 1013 | 
             
                  op1, op2 = op_to_var
         | 
| 1014 1014 | 
             
                  if @return_type and @return_type.type.kind_of?(Real) then
         | 
| 1015 1015 | 
             
                    if @return_type.type.size <= 4 then
         | 
| 1016 | 
            -
                      return "((#{op1} < 0) ^ (#{op2} < 0) ? fmodf(#{op1}, #{op2}) + #{op2} : fmodf(#{op1}, #{op2})) | 
| 1016 | 
            +
                      return "((#{op1} < 0) ^ (#{op2} < 0) ? fmodf(#{op1}, #{op2}) + #{op2} : fmodf(#{op1}, #{op2}))"
         | 
| 1017 1017 | 
             
                    else
         | 
| 1018 1018 | 
             
                      return "((#{op1} < 0) ^ (#{op2} < 0) ? fmod(#{op1}, #{op2}) + #{op2} : fmod(#{op1}, #{op2}))"
         | 
| 1019 1019 | 
             
                    end
         | 
| 1020 1020 | 
             
                  else
         | 
| 1021 | 
            -
                     | 
| 1021 | 
            +
                    test_op1 = true
         | 
| 1022 | 
            +
                    test_op1 = false if op1.respond_to?(:type) and op1.type.respond_to?(:signed?) and not op1.type.signed?
         | 
| 1023 | 
            +
                    test_op2 = true
         | 
| 1024 | 
            +
                    test_op2 = false if op2.respond_to?(:type) and op2.type.respond_to?(:signed?) and not op2.type.signed?
         | 
| 1025 | 
            +
                    if test_op1 and test_op2 then
         | 
| 1026 | 
            +
                      return "((#{op1} < 0) ^ (#{op2} < 0) ? (#{op1} % #{op2}) + #{op2} : #{op1} % #{op2})"
         | 
| 1027 | 
            +
                    elsif test_op1 then
         | 
| 1028 | 
            +
                      return "( (#{op1} < 0) ? (#{op1} % #{op2.cast(op1)}) + #{op2} : #{op1} % #{op2})"
         | 
| 1029 | 
            +
                    elsif test_op2 then
         | 
| 1030 | 
            +
                      return "( (#{op2} < 0) ? (#{op1.cast(op2)} % #{op2}) + #{op2} : #{op1} % #{op2})"
         | 
| 1031 | 
            +
                    else
         | 
| 1032 | 
            +
                      return "(#{op1} % #{op2})"
         | 
| 1033 | 
            +
                    end
         | 
| 1022 1034 | 
             
                  end
         | 
| 1023 1035 | 
             
                end
         | 
| 1024 1036 |  | 
| @@ -1056,9 +1068,9 @@ module BOAST | |
| 1056 1068 |  | 
| 1057 1069 | 
             
                def pr
         | 
| 1058 1070 | 
             
                  s=""
         | 
| 1059 | 
            -
                  s  | 
| 1060 | 
            -
                  s  | 
| 1061 | 
            -
                  s  | 
| 1071 | 
            +
                  s << indent
         | 
| 1072 | 
            +
                  s << to_s
         | 
| 1073 | 
            +
                  s << ";" if [C, CL, CUDA].include?( lang )
         | 
| 1062 1074 | 
             
                  output.puts s
         | 
| 1063 1075 | 
             
                  return self
         | 
| 1064 1076 | 
             
                end
         | 
| @@ -17,19 +17,19 @@ module BOAST | |
| 17 17 | 
             
                def to_s
         | 
| 18 18 | 
             
                  s = ""
         | 
| 19 19 | 
             
                  if lang == FORTRAN then
         | 
| 20 | 
            -
                    s  | 
| 20 | 
            +
                    s << "!#{@name}$"
         | 
| 21 21 | 
             
                  else
         | 
| 22 | 
            -
                    s  | 
| 22 | 
            +
                    s << "#pragma #{name}"
         | 
| 23 23 | 
             
                  end
         | 
| 24 24 | 
             
                  @options.each{ |opt|
         | 
| 25 | 
            -
                    s  | 
| 25 | 
            +
                    s << " #{opt}"
         | 
| 26 26 | 
             
                  }
         | 
| 27 27 | 
             
                  return s
         | 
| 28 28 | 
             
                end
         | 
| 29 29 |  | 
| 30 30 | 
             
                def pr
         | 
| 31 31 | 
             
                  s=""
         | 
| 32 | 
            -
                  s  | 
| 32 | 
            +
                  s << to_s
         | 
| 33 33 | 
             
                  output.puts s
         | 
| 34 34 | 
             
                  return self
         | 
| 35 35 | 
             
                end
         | 
| @@ -39,14 +39,14 @@ module BOAST | |
| 39 39 | 
             
                # @private
         | 
| 40 40 | 
             
                def boast_header(lang=C)
         | 
| 41 41 | 
             
                  s = boast_header_s(lang)
         | 
| 42 | 
            -
                  s  | 
| 42 | 
            +
                  s << ";\n"
         | 
| 43 43 | 
             
                  output.print s
         | 
| 44 44 | 
             
                  return self
         | 
| 45 45 | 
             
                end
         | 
| 46 46 |  | 
| 47 47 | 
             
                def call(*parameters)
         | 
| 48 48 | 
             
                  prefix = ""
         | 
| 49 | 
            -
                  prefix  | 
| 49 | 
            +
                  prefix << "call " if lang==FORTRAN and @properties[:return].nil?
         | 
| 50 50 | 
             
                  f = FuncCall::new(@name, *parameters, :return => @properties[:return] )
         | 
| 51 51 | 
             
                  f.prefix = prefix
         | 
| 52 52 | 
             
                  return f
         | 
| @@ -114,50 +114,50 @@ module BOAST | |
| 114 114 | 
             
                  s = ""
         | 
| 115 115 | 
             
                  if lang == CL then
         | 
| 116 116 | 
             
                    if @properties[:local] then
         | 
| 117 | 
            -
                      s  | 
| 118 | 
            -
                      s  | 
| 119 | 
            -
                      s  | 
| 117 | 
            +
                      s << "#if __OPENCL_C_VERSION__ && __OPENCL_C_VERSION__ >= 120\n"
         | 
| 118 | 
            +
                      s << "static\n"
         | 
| 119 | 
            +
                      s << "#endif\n"
         | 
| 120 120 | 
             
                    else
         | 
| 121 | 
            -
                      s  | 
| 121 | 
            +
                      s << "__kernel "
         | 
| 122 122 | 
             
                      wgs = @properties[:reqd_work_group_size]
         | 
| 123 123 | 
             
                      if wgs then
         | 
| 124 | 
            -
                        s  | 
| 124 | 
            +
                        s << "__attribute__((reqd_work_group_size(#{wgs[0]},#{wgs[1]},#{wgs[2]}))) "
         | 
| 125 125 | 
             
                      end
         | 
| 126 126 | 
             
                    end
         | 
| 127 127 | 
             
                  elsif lang == CUDA then
         | 
| 128 128 | 
             
                    if @properties[:local] then
         | 
| 129 | 
            -
                      s  | 
| 129 | 
            +
                      s << "static __device__ "
         | 
| 130 130 | 
             
                    else
         | 
| 131 | 
            -
                      s  | 
| 131 | 
            +
                      s << "__global__ "
         | 
| 132 132 | 
             
                      wgs = @properties[:reqd_work_group_size]
         | 
| 133 133 | 
             
                      if wgs then
         | 
| 134 | 
            -
                        s  | 
| 134 | 
            +
                        s << "__launch_bounds__(#{wgs[0]}*#{wgs[1]}*#{wgs[2]}) "
         | 
| 135 135 | 
             
                      end
         | 
| 136 136 | 
             
                    end
         | 
| 137 137 | 
             
                  elsif lang == C then
         | 
| 138 138 | 
             
                    if @properties[:local] then
         | 
| 139 | 
            -
                      s  | 
| 139 | 
            +
                      s << "static "
         | 
| 140 140 | 
             
                    end
         | 
| 141 141 | 
             
                    if @properties[:inline] then
         | 
| 142 | 
            -
                      s | 
| 142 | 
            +
                      s << "inline "
         | 
| 143 143 | 
             
                    end
         | 
| 144 144 | 
             
                  end
         | 
| 145 145 | 
             
                  if @properties[:qualifiers] then
         | 
| 146 | 
            -
                    s  | 
| 146 | 
            +
                    s << "#{@properties[:qualifiers]} "
         | 
| 147 147 | 
             
                  end
         | 
| 148 148 | 
             
                  if @properties[:return] then
         | 
| 149 | 
            -
                    s  | 
| 149 | 
            +
                    s << "#{@properties[:return].type.decl} "
         | 
| 150 150 | 
             
                  else
         | 
| 151 | 
            -
                    s  | 
| 151 | 
            +
                    s << "void "
         | 
| 152 152 | 
             
                  end
         | 
| 153 | 
            -
                  s  | 
| 153 | 
            +
                  s << "#{@name}("
         | 
| 154 154 | 
             
                  if @parameters.first then
         | 
| 155 | 
            -
                    s  | 
| 155 | 
            +
                    s << @parameters.first.send(:decl_c_s, @properties[:local])
         | 
| 156 156 | 
             
                    @parameters[1..-1].each { |p|
         | 
| 157 | 
            -
                      s  | 
| 157 | 
            +
                      s << ", "+p.send(:decl_c_s, @properties[:local])
         | 
| 158 158 | 
             
                    }
         | 
| 159 159 | 
             
                  end
         | 
| 160 | 
            -
                  s  | 
| 160 | 
            +
                  s << ")"
         | 
| 161 161 | 
             
                  return s
         | 
| 162 162 | 
             
                end
         | 
| 163 163 |  | 
| @@ -170,13 +170,13 @@ module BOAST | |
| 170 170 | 
             
                def to_s_fortran
         | 
| 171 171 | 
             
                  s = ""
         | 
| 172 172 | 
             
                  if @properties[:return] then
         | 
| 173 | 
            -
                    s  | 
| 173 | 
            +
                    s << "#{@properties[:return].type.decl} FUNCTION "
         | 
| 174 174 | 
             
                  else
         | 
| 175 | 
            -
                    s  | 
| 175 | 
            +
                    s << "SUBROUTINE "
         | 
| 176 176 | 
             
                  end
         | 
| 177 | 
            -
                  s  | 
| 178 | 
            -
                  s  | 
| 179 | 
            -
                  s  | 
| 177 | 
            +
                  s << "#{@name}("
         | 
| 178 | 
            +
                  s << @parameters.collect(&:name).join(", ")
         | 
| 179 | 
            +
                  s << ")"
         | 
| 180 180 | 
             
                end
         | 
| 181 181 |  | 
| 182 182 | 
             
                def open_c
         | 
| @@ -205,7 +205,7 @@ module BOAST | |
| 205 205 |  | 
| 206 206 | 
             
                def open_fortran
         | 
| 207 207 | 
             
                  s = indent + to_s_fortran
         | 
| 208 | 
            -
                  s  | 
| 208 | 
            +
                  s << "\n"
         | 
| 209 209 | 
             
                  increment_indent_level
         | 
| 210 210 | 
             
                  tmp_buff = StringIO::new
         | 
| 211 211 | 
             
                  push_env( :output => tmp_buff ) {
         | 
| @@ -214,8 +214,8 @@ module BOAST | |
| 214 214 | 
             
                    }
         | 
| 215 215 | 
             
                  }
         | 
| 216 216 | 
             
                  tmp_buff.rewind
         | 
| 217 | 
            -
                  s  | 
| 218 | 
            -
                  s  | 
| 217 | 
            +
                  s << tmp_buff.read
         | 
| 218 | 
            +
                  s << indent + "integer, parameter :: wp=kind(1.0d0)"
         | 
| 219 219 | 
             
                  output.puts s
         | 
| 220 220 | 
             
                  @constants.each { |c|
         | 
| 221 221 | 
             
                    BOAST::decl c
         | 
| @@ -247,9 +247,9 @@ module BOAST | |
| 247 247 |  | 
| 248 248 | 
             
                def close_c
         | 
| 249 249 | 
             
                  s = ""
         | 
| 250 | 
            -
                  s  | 
| 250 | 
            +
                  s << indent + "return #{@properties[:return]};\n" if @properties[:return]
         | 
| 251 251 | 
             
                  decrement_indent_level
         | 
| 252 | 
            -
                  s  | 
| 252 | 
            +
                  s << indent + "}"
         | 
| 253 253 | 
             
                  output.puts s
         | 
| 254 254 | 
             
                  return self
         | 
| 255 255 | 
             
                end
         | 
| @@ -257,12 +257,12 @@ module BOAST | |
| 257 257 | 
             
                def close_fortran
         | 
| 258 258 | 
             
                  s = ""
         | 
| 259 259 | 
             
                  if @properties[:return] then
         | 
| 260 | 
            -
                    s  | 
| 260 | 
            +
                    s << indent + "#{@name} = #{@properties[:return]}\n"
         | 
| 261 261 | 
             
                    decrement_indent_level
         | 
| 262 | 
            -
                    s  | 
| 262 | 
            +
                    s << indent + "END FUNCTION #{@name}"
         | 
| 263 263 | 
             
                  else
         | 
| 264 264 | 
             
                    decrement_indent_level
         | 
| 265 | 
            -
                    s  | 
| 265 | 
            +
                    s << indent + "END SUBROUTINE #{@name}"
         | 
| 266 266 | 
             
                  end
         | 
| 267 267 | 
             
                  output.puts s
         | 
| 268 268 | 
             
                  return self
         | 
| @@ -271,38 +271,38 @@ module BOAST | |
| 271 271 | 
             
                def boast_header_s( lang=C )
         | 
| 272 272 | 
             
                  s = ""
         | 
| 273 273 | 
             
                  headers.each { |h|
         | 
| 274 | 
            -
                    s  | 
| 274 | 
            +
                    s << "#include <#{h}>\n"
         | 
| 275 275 | 
             
                  }
         | 
| 276 276 | 
             
                  if lang == CL then
         | 
| 277 | 
            -
                    s  | 
| 277 | 
            +
                    s << "__kernel "
         | 
| 278 278 | 
             
                    wgs = @properties[:reqd_work_group_size]
         | 
| 279 279 | 
             
                    if wgs then
         | 
| 280 | 
            -
                      s  | 
| 280 | 
            +
                      s << "__attribute__((reqd_work_group_size(#{wgs[0]},#{wgs[1]},#{wgs[2]}))) "
         | 
| 281 281 | 
             
                    end
         | 
| 282 282 | 
             
                  end
         | 
| 283 283 | 
             
                  trailer = ""
         | 
| 284 | 
            -
                  trailer  | 
| 285 | 
            -
                  trailer  | 
| 284 | 
            +
                  trailer << "_" if lang == FORTRAN
         | 
| 285 | 
            +
                  trailer << "_wrapper" if lang == CUDA
         | 
| 286 286 | 
             
                  if @properties[:return] then
         | 
| 287 | 
            -
                    s  | 
| 287 | 
            +
                    s << "#{@properties[:return].type.decl} "
         | 
| 288 288 | 
             
                  elsif lang == CUDA
         | 
| 289 | 
            -
                    s  | 
| 289 | 
            +
                    s << "unsigned long long int "
         | 
| 290 290 | 
             
                  else
         | 
| 291 | 
            -
                    s  | 
| 291 | 
            +
                    s << "void "
         | 
| 292 292 | 
             
                  end
         | 
| 293 | 
            -
                  s  | 
| 293 | 
            +
                  s << "#{@name}#{trailer}("
         | 
| 294 294 | 
             
                  if @parameters.first then
         | 
| 295 | 
            -
                    s  | 
| 295 | 
            +
                    s << @parameters.first.boast_header(lang)
         | 
| 296 296 | 
             
                    @parameters[1..-1].each { |p|
         | 
| 297 | 
            -
                      s  | 
| 298 | 
            -
                      s  | 
| 297 | 
            +
                      s << ", "
         | 
| 298 | 
            +
                      s << p.boast_header(lang)
         | 
| 299 299 | 
             
                    }
         | 
| 300 300 | 
             
                  end
         | 
| 301 301 | 
             
                  if lang == CUDA then
         | 
| 302 | 
            -
                    s  | 
| 303 | 
            -
                    s  | 
| 302 | 
            +
                    s << ", " if parameters.first
         | 
| 303 | 
            +
                    s << "size_t *_boast_block_number, size_t *_boast_block_size, int _boast_repeat"
         | 
| 304 304 | 
             
                  end
         | 
| 305 | 
            -
                  s  | 
| 305 | 
            +
                  s << ")"
         | 
| 306 306 | 
             
                  return s
         | 
| 307 307 | 
             
                end
         | 
| 308 308 |  |