ikra 0.0.1 → 0.0.2
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/lib/ast/builder.rb +225 -77
- data/lib/ast/host_section_builder.rb +38 -0
- data/lib/ast/interpreter.rb +67 -0
- data/lib/ast/lexical_variables_enumerator.rb +3 -2
- data/lib/ast/nodes.rb +521 -31
- data/lib/ast/printer.rb +116 -18
- data/lib/ast/ssa_generator.rb +192 -0
- data/lib/ast/visitor.rb +235 -21
- data/lib/config/configuration.rb +28 -3
- data/lib/config/os_configuration.rb +62 -9
- data/lib/cpu/cpu_implementation.rb +39 -0
- data/lib/ikra.rb +13 -3
- data/lib/resources/cuda/allocate_device_memory.cpp +5 -0
- data/lib/resources/cuda/allocate_host_memory.cpp +1 -0
- data/lib/resources/cuda/allocate_memcpy_environment_to_device.cpp +11 -0
- data/lib/resources/cuda/ast/assignment.cpp +1 -0
- data/lib/resources/cuda/block_function_head.cpp +7 -1
- data/lib/resources/cuda/entry_point.cpp +47 -0
- data/lib/resources/cuda/env_builder_copy_array.cpp +8 -2
- data/lib/resources/cuda/free_device_memory.cpp +3 -0
- data/lib/resources/cuda/free_memory_for_command.cpp +24 -0
- data/lib/resources/cuda/header.cpp +23 -9
- data/lib/resources/cuda/header_structs.cpp +92 -0
- data/lib/resources/cuda/host_section_block_function_head.cpp +12 -0
- data/lib/resources/cuda/host_section_entry_point.cpp +55 -0
- data/lib/resources/cuda/host_section_free_device_memory.cpp +18 -0
- data/lib/resources/cuda/host_section_launch_parallel_section.cpp +14 -0
- data/lib/resources/cuda/host_section_malloc_memcpy_device_to_host.cpp +10 -0
- data/lib/resources/cuda/kernel.cpp +9 -2
- data/lib/resources/cuda/launch_kernel.cpp +5 -0
- data/lib/resources/cuda/memcpy_device_to_host.cpp +3 -0
- data/lib/resources/cuda/memcpy_device_to_host_expr.cpp +10 -0
- data/lib/resources/cuda/reduce_body.cpp +88 -0
- data/lib/resources/cuda/stencil_array_reconstruction.cpp +2 -0
- data/lib/resources/cuda/stencil_body.cpp +16 -0
- data/lib/resources/cuda/struct_definition.cpp +4 -0
- data/lib/ruby_core/array.rb +34 -0
- data/lib/ruby_core/array_command.rb +313 -0
- data/lib/ruby_core/core.rb +103 -0
- data/lib/ruby_core/interpreter.rb +16 -0
- data/lib/ruby_core/math.rb +32 -0
- data/lib/ruby_core/ruby_integration.rb +256 -0
- data/lib/symbolic/host_section.rb +115 -0
- data/lib/symbolic/input.rb +87 -0
- data/lib/symbolic/input_visitor.rb +68 -0
- data/lib/symbolic/symbolic.rb +793 -117
- data/lib/symbolic/visitor.rb +70 -8
- data/lib/translator/array_command_struct_builder.rb +163 -0
- data/lib/translator/ast_translator.rb +572 -0
- data/lib/translator/block_translator.rb +104 -48
- data/lib/translator/commands/array_combine_command.rb +41 -0
- data/lib/translator/commands/array_identity_command.rb +28 -0
- data/lib/translator/commands/array_index_command.rb +52 -0
- data/lib/translator/commands/array_reduce_command.rb +135 -0
- data/lib/translator/commands/array_stencil_command.rb +129 -0
- data/lib/translator/commands/array_zip_command.rb +30 -0
- data/lib/translator/commands/command_translator.rb +264 -0
- data/lib/translator/cuda_errors.rb +32 -0
- data/lib/translator/environment_builder.rb +263 -0
- data/lib/translator/host_section/array_host_section_command.rb +150 -0
- data/lib/translator/host_section/array_in_host_section_command.rb +41 -0
- data/lib/translator/host_section/ast_translator.rb +14 -0
- data/lib/translator/host_section/parallel_section_invocation_visitor.rb +20 -0
- data/lib/translator/host_section/program_builder.rb +89 -0
- data/lib/translator/input_translator.rb +226 -0
- data/lib/translator/kernel_builder.rb +137 -0
- data/lib/translator/kernel_launcher/for_loop_kernel_launcher.rb +40 -0
- data/lib/translator/kernel_launcher/kernel_launcher.rb +259 -0
- data/lib/translator/kernel_launcher/while_loop_kernel_launcher.rb +38 -0
- data/lib/translator/last_returns_visitor.rb +19 -10
- data/lib/translator/program_builder.rb +197 -0
- data/lib/translator/program_launcher.rb +273 -0
- data/lib/translator/struct_type.rb +55 -0
- data/lib/translator/translator.rb +34 -11
- data/lib/translator/variable_classifier_visitor.rb +56 -0
- data/lib/types/inference/ast_inference.rb +586 -0
- data/lib/types/inference/clear_types_visitor.rb +11 -0
- data/lib/types/inference/command_inference.rb +101 -0
- data/lib/types/inference/input_inference.rb +62 -0
- data/lib/types/{object_tracer.rb → inference/object_tracer.rb} +5 -6
- data/lib/types/inference/ruby_extension.rb +35 -0
- data/lib/types/inference/symbol_table.rb +131 -0
- data/lib/types/types.rb +14 -0
- data/lib/types/types/array_command_type.rb +123 -0
- data/lib/types/types/array_type.rb +137 -0
- data/lib/types/{class_type.rb → types/class_type.rb} +42 -18
- data/lib/types/{primitive_type.rb → types/primitive_type.rb} +20 -7
- data/lib/types/types/ruby_type.rb +88 -0
- data/lib/types/types/struct_type.rb +179 -0
- data/lib/types/types/union_type.rb +239 -0
- metadata +160 -18
- data/lib/ast/method_definition.rb +0 -37
- data/lib/ast/translator.rb +0 -264
- data/lib/resources/cuda/kernel_launcher.cpp +0 -28
- data/lib/scope.rb +0 -166
- data/lib/translator/command_translator.rb +0 -421
- data/lib/translator/local_variables_enumerator.rb +0 -35
- data/lib/translator/method_translator.rb +0 -24
- data/lib/types/array_type.rb +0 -51
- data/lib/types/ruby_extension.rb +0 -67
- data/lib/types/ruby_type.rb +0 -45
- data/lib/types/type_inference.rb +0 -382
- data/lib/types/union_type.rb +0 -155
data/lib/config/configuration.rb
CHANGED
@@ -1,18 +1,43 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
require_relative "../symbolic/symbolic"
|
4
|
+
|
1
5
|
module Ikra
|
2
6
|
module Configuration
|
3
7
|
JOB_REORDERING = true
|
4
8
|
@@expect_file_name = "last_generated"
|
5
9
|
|
6
10
|
def self.resource_file_name(file_name)
|
7
|
-
|
11
|
+
File.expand_path("resources/cuda/#{file_name}", File.dirname(File.dirname(File.expand_path(__FILE__))))
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.codegen_expect_file_name_for(file_name)
|
15
|
+
FileUtils.mkdir_p(File.expand_path("gen/codegen_expect", File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))))
|
16
|
+
|
17
|
+
File.expand_path("gen/codegen_expect/#{file_name}", File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))))
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.log_file_name_for(test_case_name)
|
21
|
+
FileUtils.mkdir_p(File.expand_path("gen/log", File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__))))))
|
22
|
+
|
23
|
+
File.expand_path("gen/log/#{test_case_name}.log", File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))))
|
8
24
|
end
|
9
25
|
|
10
26
|
def self.codegen_expect_file_name
|
11
|
-
|
27
|
+
if @@expect_file_name == nil
|
28
|
+
# Do not generate expect file
|
29
|
+
return nil
|
30
|
+
end
|
31
|
+
|
32
|
+
return codegen_expect_file_name_for(@@expect_file_name + ".cu")
|
12
33
|
end
|
13
34
|
|
14
35
|
def self.codegen_expect_file_name=(value)
|
15
|
-
|
36
|
+
@@expect_file_name = value
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.reset_state
|
40
|
+
Symbolic::ArrayCommand.reset_unique_id
|
16
41
|
end
|
17
42
|
end
|
18
43
|
end
|
@@ -1,25 +1,78 @@
|
|
1
1
|
require "rbconfig"
|
2
|
+
require "logger"
|
2
3
|
|
3
4
|
module Ikra
|
4
5
|
module Configuration
|
6
|
+
|
7
|
+
# These values are used only if auto configuration fails
|
8
|
+
@cuda_manual_nvcc = "/usr/local/cuda-8.0/bin/nvcc"
|
9
|
+
@cuda_manual_common_include = "/home/matthias/NVIDIA_CUDA-7.5_Samples/common/inc"
|
10
|
+
@cuda_manual_cupti_include = "/usr/local/cuda-7.5/extras/CUPTI/include"
|
11
|
+
|
12
|
+
@is_initialized = false
|
13
|
+
@auto_config = true
|
14
|
+
|
5
15
|
class << self
|
6
16
|
SUPPORTED_OS = [:linux, :macosx]
|
7
|
-
|
17
|
+
ATTEMPT_AUTO_CONFIG = true
|
18
|
+
|
19
|
+
attr_accessor :cuda_manual_nvcc
|
20
|
+
attr_accessor :cuda_manual_common_include
|
21
|
+
attr_accessor :cuda_manual_cupti_include
|
22
|
+
attr_accessor :auto_config
|
23
|
+
|
24
|
+
def is_initialized?
|
25
|
+
return @is_initialized
|
26
|
+
end
|
8
27
|
|
9
|
-
def
|
28
|
+
def reinitialize!
|
10
29
|
if !SUPPORTED_OS.include?(operating_system)
|
11
|
-
raise "Operating system not supported: #{operating_system}"
|
30
|
+
raise AssertionError.new("Operating system not supported: #{operating_system}")
|
31
|
+
end
|
32
|
+
|
33
|
+
@cuda_nvcc = cuda_manual_nvcc
|
34
|
+
@cuda_common_include = cuda_manual_common_include
|
35
|
+
@cuda_cupti_include = cuda_manual_cupti_include
|
36
|
+
|
37
|
+
# Auto configuration
|
38
|
+
if auto_config
|
39
|
+
Log.info("Attempting CUDA path auto configuration")
|
40
|
+
|
41
|
+
nvcc_path = %x(which nvcc)
|
42
|
+
|
43
|
+
if $?.exitstatus == 0
|
44
|
+
cuda_path = File.expand_path("../..", nvcc_path)
|
45
|
+
@cuda_nvcc = File.expand_path("bin/nvcc", cuda_path)
|
46
|
+
@cuda_common_include = File.expand_path("samples/common/inc", cuda_path)
|
47
|
+
@cuda_cupti_include = File.expand_path("extras/CUPTI/include", cuda_path)
|
48
|
+
else
|
49
|
+
Log.warn("CUDA path auto configuration failed")
|
50
|
+
end
|
12
51
|
end
|
13
52
|
|
14
53
|
# Check if nvcc is installed
|
15
|
-
%x(#{
|
54
|
+
%x(#{@cuda_nvcc} 2>&1)
|
16
55
|
if $?.exitstatus != 1
|
17
|
-
raise "nvcc not installed"
|
56
|
+
raise AssertionError.new("nvcc not installed")
|
18
57
|
end
|
58
|
+
|
59
|
+
if !File.directory?(@cuda_common_include)
|
60
|
+
raise AssertionError.new("Directory does not exist: #{@cuda_common_include}. Check OS configuration!")
|
61
|
+
end
|
62
|
+
|
63
|
+
if !File.directory?(@cuda_cupti_include)
|
64
|
+
raise AssertionError.new("Directory does not exist: #{@cuda_cupti_include}. Check OS configuration!")
|
65
|
+
end
|
66
|
+
|
67
|
+
@is_initialized = true
|
19
68
|
end
|
20
69
|
|
21
70
|
def nvcc_invocation_string(in_file, out_file)
|
22
|
-
|
71
|
+
if !is_initialized?
|
72
|
+
reinitialize!
|
73
|
+
end
|
74
|
+
|
75
|
+
return "#{@cuda_nvcc} -o #{out_file} -I#{@cuda_common_include} -I#{@cuda_cupti_include} --shared -Xcompiler -fPIC -std=c++11 #{in_file} 2>&1"
|
23
76
|
end
|
24
77
|
|
25
78
|
def so_suffix
|
@@ -30,7 +83,7 @@ module Ikra
|
|
30
83
|
elsif operating_system == :windows
|
31
84
|
"dll"
|
32
85
|
else
|
33
|
-
raise "Operating system not supported"
|
86
|
+
raise AssertionError.new("Operating system not supported")
|
34
87
|
end
|
35
88
|
end
|
36
89
|
|
@@ -48,9 +101,9 @@ module Ikra
|
|
48
101
|
when /solaris|bsd/
|
49
102
|
:unix
|
50
103
|
else
|
51
|
-
raise "Unknown operating system"
|
104
|
+
raise AssertionError.new("Unknown operating system")
|
52
105
|
end
|
53
106
|
end
|
54
107
|
end
|
55
108
|
end
|
56
|
-
end
|
109
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class Array
|
2
|
+
def stencil(neighbors, out_of_range_value, use_parameter_array: true, with_index: false, &block)
|
3
|
+
copy = self.dup
|
4
|
+
|
5
|
+
return Array.new(size) do |index|
|
6
|
+
if neighbors.min + index < 0 || neighbors.max + index > size - 1
|
7
|
+
out_of_range_value
|
8
|
+
else
|
9
|
+
values = neighbors.map do |offset|
|
10
|
+
copy[index + offset]
|
11
|
+
end
|
12
|
+
|
13
|
+
if use_parameter_array
|
14
|
+
if with_index
|
15
|
+
block.call(values, index)
|
16
|
+
else
|
17
|
+
block.call(values)
|
18
|
+
end
|
19
|
+
else
|
20
|
+
if with_index
|
21
|
+
block.call(*values, index)
|
22
|
+
else
|
23
|
+
block.call(*values)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def combine(*others, &block)
|
31
|
+
return Array.new(self.size) do |index|
|
32
|
+
other_elements = others.map do |other|
|
33
|
+
other[index]
|
34
|
+
end
|
35
|
+
|
36
|
+
block.call(self[index], *other_elements)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/ikra.rb
CHANGED
@@ -1,7 +1,17 @@
|
|
1
1
|
require "logger"
|
2
|
-
require_relative "symbolic/symbolic"
|
3
|
-
require_relative "entity"
|
4
2
|
|
5
3
|
module Ikra
|
6
4
|
Log = Logger.new(STDOUT)
|
7
|
-
|
5
|
+
|
6
|
+
class AssertionError < RuntimeError
|
7
|
+
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
require_relative "ruby_core/ruby_integration"
|
12
|
+
require_relative "symbolic/symbolic"
|
13
|
+
require_relative "entity"
|
14
|
+
require_relative "translator/cuda_errors"
|
15
|
+
require_relative "cpu/cpu_implementation"
|
16
|
+
|
17
|
+
Ikra::Translator::CommandTranslator::ProgramBuilder::Launcher.reset_time
|
@@ -0,0 +1 @@
|
|
1
|
+
/*{type}*/ * /*{name}*/ = (/*{type}*/ *) malloc(/*{bytes}*/);
|
@@ -0,0 +1,11 @@
|
|
1
|
+
/* Allocate device environment and copy over struct */
|
2
|
+
environment_t */*{dev_env}*/;
|
3
|
+
|
4
|
+
timeStartMeasure();
|
5
|
+
checkErrorReturn(program_result, cudaMalloc(&/*{dev_env}*/, sizeof(environment_t)));
|
6
|
+
timeReportMeasure(program_result, allocate_memory);
|
7
|
+
|
8
|
+
timeStartMeasure();
|
9
|
+
checkErrorReturn(program_result, cudaMemcpy(/*{dev_env}*/, /*{host_env}*/, sizeof(environment_t), cudaMemcpyHostToDevice));
|
10
|
+
timeReportMeasure(program_result, transfer_memory);
|
11
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
/*{target}*/ = /*{source}*/
|
@@ -1 +1,7 @@
|
|
1
|
-
|
1
|
+
|
2
|
+
// TODO: There should be a better to check if /*{name}*/ is already defined
|
3
|
+
#ifndef /*{name}*/_func
|
4
|
+
#define /*{name}*/_func
|
5
|
+
__device__ /*{result_type}*/ /*{name}*/(/*{parameters}*/)
|
6
|
+
/*{body}*/
|
7
|
+
#endif
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#undef checkErrorReturn
|
2
|
+
#define checkErrorReturn(result_var, expr) \
|
3
|
+
if (result_var->last_error = expr) \
|
4
|
+
{\
|
5
|
+
cudaError_t error = cudaGetLastError();\
|
6
|
+
printf("!!! Cuda Failure %s:%d (%i): '%s'\n", __FILE__, __LINE__, expr, cudaGetErrorString(error));\
|
7
|
+
cudaDeviceReset();\
|
8
|
+
return result_var;\
|
9
|
+
}
|
10
|
+
|
11
|
+
extern "C" EXPORT result_t *launch_kernel(environment_t */*{host_env_var_name}*/)
|
12
|
+
{
|
13
|
+
// CUDA Initialization
|
14
|
+
program_result = new result_t();
|
15
|
+
program_result->device_allocations = new vector<void*>();
|
16
|
+
|
17
|
+
timeStartMeasure();
|
18
|
+
|
19
|
+
cudaError_t cudaStatus = cudaSetDevice(0);
|
20
|
+
|
21
|
+
if (cudaStatus != cudaSuccess) {
|
22
|
+
fprintf(stderr, "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?\n");
|
23
|
+
program_result->last_error = -1;
|
24
|
+
return program_result;
|
25
|
+
}
|
26
|
+
|
27
|
+
checkErrorReturn(program_result, cudaFree(0));
|
28
|
+
|
29
|
+
timeReportMeasure(program_result, setup_cuda);
|
30
|
+
|
31
|
+
|
32
|
+
/* Prepare environment */
|
33
|
+
/*{prepare_environment}*/
|
34
|
+
|
35
|
+
/* Launch all kernels */
|
36
|
+
/*{launch_all_kernels}*/
|
37
|
+
|
38
|
+
/* Copy over result to the host */
|
39
|
+
program_result->result = /*{host_result_array}*/;
|
40
|
+
|
41
|
+
/* Free device memory */
|
42
|
+
/*{free_device_memory}*/
|
43
|
+
|
44
|
+
delete program_result->device_allocations;
|
45
|
+
|
46
|
+
return program_result;
|
47
|
+
}
|
@@ -1,4 +1,10 @@
|
|
1
1
|
|
2
2
|
void * temp_ptr_/*{field}*/ = /*{host_env}*/->/*{field}*/;
|
3
|
-
|
4
|
-
|
3
|
+
|
4
|
+
timeStartMeasure();
|
5
|
+
checkErrorReturn(program_result, cudaMalloc((void **) &/*{host_env}*/->/*{field}*/, /*{size_bytes}*/));
|
6
|
+
timeReportMeasure(program_result, allocate_memory);
|
7
|
+
|
8
|
+
timeStartMeasure();
|
9
|
+
checkErrorReturn(program_result, cudaMemcpy(/*{host_env}*/->/*{field}*/, temp_ptr_/*{field}*/, /*{size_bytes}*/, cudaMemcpyHostToDevice));
|
10
|
+
timeReportMeasure(program_result, transfer_memory);
|
@@ -0,0 +1,24 @@
|
|
1
|
+
({
|
2
|
+
/*{type}*/ cmd_to_free = /*{receiver}*/;
|
3
|
+
|
4
|
+
timeStartMeasure();
|
5
|
+
bool freed_memory = false;
|
6
|
+
|
7
|
+
if (cmd_to_free->result != 0) {
|
8
|
+
checkErrorReturn(program_result, cudaFree(cmd_to_free->result));;
|
9
|
+
|
10
|
+
// Remove from list of allocations
|
11
|
+
program_result->device_allocations->erase(
|
12
|
+
std::remove(
|
13
|
+
program_result->device_allocations->begin(),
|
14
|
+
program_result->device_allocations->end(),
|
15
|
+
cmd_to_free->result),
|
16
|
+
program_result->device_allocations->end());
|
17
|
+
|
18
|
+
freed_memory = true;
|
19
|
+
}
|
20
|
+
|
21
|
+
timeReportMeasure(program_result, free_memory);
|
22
|
+
|
23
|
+
freed_memory;
|
24
|
+
})
|
@@ -1,4 +1,8 @@
|
|
1
1
|
#include <stdio.h>
|
2
|
+
#include <assert.h>
|
3
|
+
#include <chrono>
|
4
|
+
#include <vector>
|
5
|
+
#include <algorithm>
|
2
6
|
|
3
7
|
#include <helper_cuda.h>
|
4
8
|
#include <helper_cuda_gl.h>
|
@@ -30,17 +34,27 @@ typedef int obj_id_t;
|
|
30
34
|
typedef int class_id_t;
|
31
35
|
/* ----- END Class Type ----- */
|
32
36
|
|
33
|
-
/* ----- BEGIN Union Type ----- */
|
34
|
-
typedef struct union_type_struct
|
35
|
-
{
|
36
|
-
class_id_t class_id;
|
37
|
-
obj_id_t object_id;
|
38
|
-
} union_t;
|
39
|
-
/* ----- END Union Type ----- */
|
40
|
-
|
41
|
-
|
42
37
|
/* ----- BEGIN Environment (lexical variables) ----- */
|
43
38
|
// environment_struct must be defined later
|
44
39
|
typedef struct environment_struct environment_t;
|
45
40
|
/* ----- END Environment (lexical variables) ----- */
|
46
41
|
|
42
|
+
|
43
|
+
/* ----- BEGIN Forward declarations ----- */
|
44
|
+
typedef struct result_t result_t;
|
45
|
+
/* ----- END Forward declarations ----- */
|
46
|
+
|
47
|
+
// Define program result variable. Also contains benchmark numbers.
|
48
|
+
result_t *program_result;
|
49
|
+
|
50
|
+
// Variables for measuring time
|
51
|
+
chrono::high_resolution_clock::time_point start_time;
|
52
|
+
chrono::high_resolution_clock::time_point end_time;
|
53
|
+
|
54
|
+
/* ----- BEGIN Macros ----- */
|
55
|
+
#define timeStartMeasure() start_time = chrono::high_resolution_clock::now();
|
56
|
+
|
57
|
+
#define timeReportMeasure(result_var, variable_name) \
|
58
|
+
end_time = chrono::high_resolution_clock::now(); \
|
59
|
+
result_var->time_##variable_name = result_var->time_##variable_name + chrono::duration_cast<chrono::microseconds>(end_time - start_time).count();
|
60
|
+
/* ----- END Macros ----- */
|
@@ -0,0 +1,92 @@
|
|
1
|
+
/* ----- BEGIN Structs ----- */
|
2
|
+
struct variable_size_array_t {
|
3
|
+
void *content;
|
4
|
+
int size;
|
5
|
+
|
6
|
+
variable_size_array_t(void *content_ = NULL, int size_ = 0) : content(content_), size(size_) { };
|
7
|
+
|
8
|
+
static const variable_size_array_t error_return_value;
|
9
|
+
};
|
10
|
+
|
11
|
+
// error_return_value is used in case a host section terminates abnormally
|
12
|
+
const variable_size_array_t variable_size_array_t::error_return_value =
|
13
|
+
variable_size_array_t(NULL, 0);
|
14
|
+
|
15
|
+
/* ----- BEGIN Union Type ----- */
|
16
|
+
typedef union union_type_value {
|
17
|
+
obj_id_t object_id;
|
18
|
+
int int_;
|
19
|
+
float float_;
|
20
|
+
bool bool_;
|
21
|
+
void *pointer;
|
22
|
+
variable_size_array_t variable_size_array;
|
23
|
+
|
24
|
+
__host__ __device__ union_type_value(int value) : int_(value) { };
|
25
|
+
__host__ __device__ union_type_value(float value) : float_(value) { };
|
26
|
+
__host__ __device__ union_type_value(bool value) : bool_(value) { };
|
27
|
+
__host__ __device__ union_type_value(void *value) : pointer(value) { };
|
28
|
+
__host__ __device__ union_type_value(variable_size_array_t value) : variable_size_array(value) { };
|
29
|
+
|
30
|
+
__host__ __device__ static union_type_value from_object_id(obj_id_t value)
|
31
|
+
{
|
32
|
+
return union_type_value(value);
|
33
|
+
}
|
34
|
+
|
35
|
+
__host__ __device__ static union_type_value from_int(int value)
|
36
|
+
{
|
37
|
+
return union_type_value(value);
|
38
|
+
}
|
39
|
+
|
40
|
+
__host__ __device__ static union_type_value from_float(float value)
|
41
|
+
{
|
42
|
+
return union_type_value(value);
|
43
|
+
}
|
44
|
+
|
45
|
+
__host__ __device__ static union_type_value from_bool(bool value)
|
46
|
+
{
|
47
|
+
return union_type_value(value);
|
48
|
+
}
|
49
|
+
|
50
|
+
__host__ __device__ static union_type_value from_pointer(void *value)
|
51
|
+
{
|
52
|
+
return union_type_value(value);
|
53
|
+
}
|
54
|
+
|
55
|
+
__host__ __device__ static union_type_value from_variable_size_array_t(variable_size_array_t value)
|
56
|
+
{
|
57
|
+
return union_type_value(value);
|
58
|
+
}
|
59
|
+
} union_v_t;
|
60
|
+
|
61
|
+
typedef struct union_type_struct
|
62
|
+
{
|
63
|
+
class_id_t class_id;
|
64
|
+
union_v_t value;
|
65
|
+
|
66
|
+
__host__ __device__ union_type_struct(
|
67
|
+
class_id_t class_id_ = 0, union_v_t value_ = union_v_t(0))
|
68
|
+
: class_id(class_id_), value(value_) { };
|
69
|
+
|
70
|
+
static const union_type_struct error_return_value;
|
71
|
+
} union_t;
|
72
|
+
|
73
|
+
// error_return_value is used in case a host section terminates abnormally
|
74
|
+
const union_type_struct union_t::error_return_value = union_type_struct(0, union_v_t(0));
|
75
|
+
/* ----- END Union Type ----- */
|
76
|
+
|
77
|
+
typedef struct result_t {
|
78
|
+
/*{result_type}*/ result;
|
79
|
+
int last_error;
|
80
|
+
|
81
|
+
uint64_t time_setup_cuda;
|
82
|
+
uint64_t time_prepare_env;
|
83
|
+
uint64_t time_kernel;
|
84
|
+
uint64_t time_free_memory;
|
85
|
+
uint64_t time_transfer_memory;
|
86
|
+
uint64_t time_allocate_memory;
|
87
|
+
|
88
|
+
// Memory management
|
89
|
+
vector<void*> *device_allocations;
|
90
|
+
} result_t;
|
91
|
+
/* ----- END Structs ----- */
|
92
|
+
|