tried storing data in CuArray. Weird type error is happening
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				CI / Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} (x64, ubuntu-latest, 1.10) (push) Has been cancelled
				
			
		
			
				
	
				CI / Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} (x64, ubuntu-latest, 1.6) (push) Has been cancelled
				
			
		
			
				
	
				CI / Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} (x64, ubuntu-latest, pre) (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	CI / Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} (x64, ubuntu-latest, 1.10) (push) Has been cancelled
				
			CI / Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} (x64, ubuntu-latest, 1.6) (push) Has been cancelled
				
			CI / Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} (x64, ubuntu-latest, pre) (push) Has been cancelled
				
			This commit is contained in:
		@ -5,22 +5,24 @@ export replace_variables!
 | 
				
			|||||||
export expr_to_postfix
 | 
					export expr_to_postfix
 | 
				
			||||||
export SymbolTable64
 | 
					export SymbolTable64
 | 
				
			||||||
export PostfixType
 | 
					export PostfixType
 | 
				
			||||||
 | 
					export Operator, Add, Subtract, Multiply, Divide, Power, Abs, Log, Exp, Sqrt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@enum Operator Add=1 Subtract=2 Multiply=3 Divide=4 Power=5 Abs=6 Log=7 Exp=8 Sqrt=9
 | 
				
			||||||
const SymbolTable64 = Dict{Tuple{Expr, Symbol},Float64}
 | 
					const SymbolTable64 = Dict{Tuple{Expr, Symbol},Float64}
 | 
				
			||||||
const PostfixType = Array{Union{Float64,String},1}
 | 
					const PostfixType = Vector{Union{Float64,Operator,Symbol}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Maybe switch from Array{String} to Array{Union{Float64, Symbol}}?
 | 
					# Maybe switch from Array{String} to Array{Union{Float64, Symbol}}?
 | 
				
			||||||
function expr_to_postfix(expr::Expr)::PostfixType
 | 
					function expr_to_postfix(expr::Expr)::PostfixType
 | 
				
			||||||
	postfix = PostfixType()
 | 
						postfix = PostfixType()
 | 
				
			||||||
	operator = String(expr.args[1])
 | 
						operator = get_operator(expr.args[1])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# push!(postfix, expr.args[2], expr.args[3], operator)
 | 
						# push!(postfix, expr.args[2], expr.args[3], operator)
 | 
				
			||||||
	for j in 2:length(expr.args)
 | 
						for j in 2:length(expr.args)
 | 
				
			||||||
		arg = expr.args[j]
 | 
							arg = expr.args[j]
 | 
				
			||||||
		if typeof(arg) === Expr
 | 
							if typeof(arg) === Expr
 | 
				
			||||||
			append!(postfix, expr_to_postfix(arg))
 | 
								append!(postfix, expr_to_postfix(arg))
 | 
				
			||||||
		elseif typeof(arg) === Symbol
 | 
							elseif typeof(arg) === Symbol # variables/parameters
 | 
				
			||||||
			push!(postfix, String(arg))
 | 
								push!(postfix, arg)
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			push!(postfix, convert(Float64, arg))
 | 
								push!(postfix, convert(Float64, arg))
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
@ -76,4 +78,26 @@ function fill_symtable!(expr::Expr, symtable::SymbolTable64, values::Vector{Floa
 | 
				
			|||||||
	end
 | 
						end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_operator(op::Symbol)::Operator
 | 
				
			||||||
 | 
						if op == :+
 | 
				
			||||||
 | 
							return Add
 | 
				
			||||||
 | 
						elseif op == :-
 | 
				
			||||||
 | 
							return Subtract
 | 
				
			||||||
 | 
						elseif op == :*
 | 
				
			||||||
 | 
							return Multiply
 | 
				
			||||||
 | 
						elseif op == :/
 | 
				
			||||||
 | 
							return Divide
 | 
				
			||||||
 | 
						elseif op == :^
 | 
				
			||||||
 | 
							return Power
 | 
				
			||||||
 | 
						elseif op == :abs
 | 
				
			||||||
 | 
							return Abs
 | 
				
			||||||
 | 
						elseif op == :log
 | 
				
			||||||
 | 
							return Log
 | 
				
			||||||
 | 
						elseif op == :exp
 | 
				
			||||||
 | 
							return Exp
 | 
				
			||||||
 | 
						elseif op == :sqrt
 | 
				
			||||||
 | 
							return Sqrt
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
@ -1,34 +1,35 @@
 | 
				
			|||||||
module Interpreter
 | 
					module Interpreter
 | 
				
			||||||
using CUDA
 | 
					using CUDA
 | 
				
			||||||
include("ExpressionProcessing.jl")
 | 
					include("ExpressionProcessing.jl")
 | 
				
			||||||
 | 
					using .ExpressionProcessing: PostfixType, Add, Subtract, Operator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export Interpret
 | 
				
			||||||
export CudaTest
 | 
					export CudaTest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@enum Operators Add=1 Subtract=2 Multiply=3 Division=4 Power=5 Abs=6 Log=7 Exp=8 Sqrt=9
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function CudaTest()
 | 
					function CudaTest()
 | 
				
			||||||
	N = 2^20
 | 
						N = 2^20
 | 
				
			||||||
	x = CUDA.fill(1.0f0, N)
 | 
						x = CUDA.fill(1.0f0, N)
 | 
				
			||||||
	y = CUDA.fill(2.0f0, N)
 | 
						y = CUDA.fill(2.0f0, N)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kernelAdd = @cuda launch=false InterpretExplicit!(Add, x, y)
 | 
						kernelAdd = @cuda launch=false InterpretExplicit!(ExpressionProcessing.Add, x, y)
 | 
				
			||||||
 | 
						# kernelAdd = @cuda launch=false InterpretExplicit!(Add, x, y, reference)
 | 
				
			||||||
	config = launch_configuration(kernelAdd.fun)
 | 
						config = launch_configuration(kernelAdd.fun)
 | 
				
			||||||
	threads = min(length(y), config.threads)
 | 
						threads = min(length(y), config.threads)
 | 
				
			||||||
	blocks = cld(length(y), threads)
 | 
						blocks = cld(length(y), threads)
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	kernelAdd(Add, x, y; threads, blocks)
 | 
						kernelAdd(Add, x, y; threads, blocks)
 | 
				
			||||||
	println(y[1])
 | 
						# println(y[1])
 | 
				
			||||||
	# @test all(Array(y) .== 3.0f0)
 | 
						# @test all(Array(y) .== 3.0f0)
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	kernelSubtract = @cuda launch=false InterpretExplicit!(Subtract, x, y)
 | 
						kernelSubtract = @cuda launch=false InterpretExplicit!(ExpressionProcessing.Subtract, x, y)
 | 
				
			||||||
	configSub = launch_configuration(kernelSubtract.fun)
 | 
						configSub = launch_configuration(kernelSubtract.fun)
 | 
				
			||||||
	threadsSub = min(length(y), configSub.threads)
 | 
						threadsSub = min(length(y), configSub.threads)
 | 
				
			||||||
	blocksSub = cld(length(y), threadsSub)
 | 
						blocksSub = cld(length(y), threadsSub)
 | 
				
			||||||
	CUDA.fill!(y, 2.0f0)
 | 
						CUDA.fill!(y, 2.0f0)
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	kernelSubtract(Subtract, x, y; threadsSub, blocksSub)
 | 
						# kernelSubtract(Subtract, x, y; threadsSub, blocksSub)
 | 
				
			||||||
	# @test all(Array(y) .== -1.0f0)
 | 
						# @test all(Array(y) .== -1.0f0)
 | 
				
			||||||
	println(y[1])
 | 
						# println(y[1])
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"Interprets the given expressions with the values provided.
 | 
					"Interprets the given expressions with the values provided.
 | 
				
			||||||
@ -42,22 +43,27 @@ function Interpret(expressions::Vector{ExpressionProcessing.PostfixType}, variab
 | 
				
			|||||||
	#      create CUDA array and fill it with the expressions, variables and parameters
 | 
						#      create CUDA array and fill it with the expressions, variables and parameters
 | 
				
			||||||
	#      calculate needed number of threads, probably based off of the number of expressions, so I can ensure each warp takes the same execution path
 | 
						#      calculate needed number of threads, probably based off of the number of expressions, so I can ensure each warp takes the same execution path
 | 
				
			||||||
	#      Start the kernel
 | 
						#      Start the kernel
 | 
				
			||||||
 | 
						cudaExprs = Vector{CuArray{ExpressionProcessing.PostfixType}}(undef, length(expressions))
 | 
				
			||||||
 | 
						for i in eachindex(expressions)
 | 
				
			||||||
 | 
							push!(cudaExprs, CuArray(expressions[i]))
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						# cudaExprs = CuArray(copy(expressions))
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Kernel
 | 
					# Kernel
 | 
				
			||||||
function InterpretExplicit!(op::Operators, x, y)
 | 
					function InterpretExplicit!(op::Operator, x, y)
 | 
				
			||||||
	index = (blockIdx().x - 1) * blockDim().x + threadIdx().x
 | 
						index = (blockIdx().x - 1) * blockDim().x + threadIdx().x
 | 
				
			||||||
	stride = gridDim().x * blockDim().x
 | 
						stride = gridDim().x * blockDim().x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if op == Add
 | 
						if op == Add
 | 
				
			||||||
		@cuprintln("Performing Addition") # Will only be displayed when the GPU is synchronized
 | 
							# @cuprintln("Performing Addition") # Will only be displayed when the GPU is synchronized
 | 
				
			||||||
		for i = index:stride:length(y)
 | 
							for i = index:stride:length(y)
 | 
				
			||||||
			@inbounds y[i] += x[i]
 | 
								@inbounds y[i] += x[i]
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	elseif op == Subtract
 | 
						elseif op == Subtract
 | 
				
			||||||
		@cuprintln("Performing Subtraction") # Will only be displayed when the GPU is synchronized
 | 
							# @cuprintln("Performing Subtraction") # Will only be displayed when the GPU is synchronized
 | 
				
			||||||
		for i = index:stride:length(y)
 | 
							for i = index:stride:length(y)
 | 
				
			||||||
			@inbounds y[i] -= x[i]
 | 
								@inbounds y[i] -= x[i]
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					using .ExpressionProcessing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
expressions = Vector{Expr}(undef, 1)
 | 
					expressions = Vector{Expr}(undef, 1)
 | 
				
			||||||
variables = Matrix{Float64}(undef, 1,2)
 | 
					variables = Matrix{Float64}(undef, 1,2)
 | 
				
			||||||
parameters = Vector{Vector{Float64}}(undef, 1)
 | 
					parameters = Vector{Vector{Float64}}(undef, 1)
 | 
				
			||||||
@ -10,7 +12,7 @@ parameters[1] = Vector{Float64}(undef, 1)
 | 
				
			|||||||
parameters[1][1] = 5
 | 
					parameters[1][1] = 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@testset "Test symtable construction" begin
 | 
					@testset "Test symtable construction" begin
 | 
				
			||||||
	symtable = ExpressionExecutorCuda.ExpressionProcessing.construct_symtable(expressions, variables, parameters)
 | 
						symtable = construct_symtable(expressions, variables, parameters)
 | 
				
			||||||
	@test haskey(symtable, (expressions[1], :x1))
 | 
						@test haskey(symtable, (expressions[1], :x1))
 | 
				
			||||||
	@test haskey(symtable, (expressions[1], :x2))
 | 
						@test haskey(symtable, (expressions[1], :x2))
 | 
				
			||||||
	@test haskey(symtable, (expressions[1], :p1))
 | 
						@test haskey(symtable, (expressions[1], :p1))
 | 
				
			||||||
@ -21,17 +23,17 @@ parameters[1][1] = 5
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@testset "Test variable replacement in expression" begin
 | 
					@testset "Test variable replacement in expression" begin
 | 
				
			||||||
	symtable = ExpressionExecutorCuda.ExpressionProcessing.construct_symtable(expressions, variables, parameters)
 | 
						symtable = construct_symtable(expressions, variables, parameters)
 | 
				
			||||||
	exprCopy = deepcopy(expressions[1])
 | 
						exprCopy = deepcopy(expressions[1])
 | 
				
			||||||
	ExpressionExecutorCuda.ExpressionProcessing.replace_variables!(exprCopy, symtable, expressions[1])
 | 
						replace_variables!(exprCopy, symtable, expressions[1])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@test eval(exprCopy) == 10 # If it can be evaluated, it means all variables have been replaced, as there are no globally defined variables
 | 
						@test eval(exprCopy) == 10 # If it can be evaluated, it means all variables have been replaced, as there are no globally defined variables
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@testset "Test conversion to postfix" begin
 | 
					@testset "Test conversion to postfix" begin
 | 
				
			||||||
	reference = Array{Union{Float64,String},1}()
 | 
						reference = PostfixType()
 | 
				
			||||||
	append!(reference, ["x1", 1.0, "x2", "*", "+", "p1", "+"])
 | 
						append!(reference, [:x1, 1.0, :x2, Multiply, Add, :p1, Add])
 | 
				
			||||||
	postfix = ExpressionExecutorCuda.ExpressionProcessing.expr_to_postfix(expressions[1])
 | 
						postfix = expr_to_postfix(expressions[1])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@test isequal(reference, postfix)
 | 
						@test isequal(reference, postfix)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
							
								
								
									
										21
									
								
								package/test/InterpreterTests.jl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								package/test/InterpreterTests.jl
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					using .ExpressionProcessing
 | 
				
			||||||
 | 
					using .Interpreter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					expressions = Vector{Expr}(undef, 1)
 | 
				
			||||||
 | 
					variables = Matrix{Float64}(undef, 1,2)
 | 
				
			||||||
 | 
					parameters = Vector{Vector{Float64}}(undef, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Resulting value should be 10
 | 
				
			||||||
 | 
					expressions[1] = :(x1 + 1 * x2 + p1)
 | 
				
			||||||
 | 
					variables[1,1] = 2
 | 
				
			||||||
 | 
					variables[1,2] = 3
 | 
				
			||||||
 | 
					parameters[1] = Vector{Float64}(undef, 1)
 | 
				
			||||||
 | 
					parameters[1][1] = 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@testset "Test interpretation" begin
 | 
				
			||||||
 | 
						postfixExpr = expr_to_postfix(expressions[1])
 | 
				
			||||||
 | 
						postfixExprs = Vector{PostfixType}(undef, 1)
 | 
				
			||||||
 | 
						postfixExprs[1] = postfixExpr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Interpret(postfixExprs, variables, parameters)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@ -1,2 +1,3 @@
 | 
				
			|||||||
[deps]
 | 
					[deps]
 | 
				
			||||||
 | 
					CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
 | 
				
			||||||
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
 | 
					Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,11 @@
 | 
				
			|||||||
using ExpressionExecutorCuda
 | 
					using ExpressionExecutorCuda
 | 
				
			||||||
using Test
 | 
					using Test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const baseFolder = dirname(dirname(pathof(ExpressionExecutorCuda)))
 | 
				
			||||||
 | 
					include(joinpath(baseFolder, "src", "ExpressionProcessing.jl"))
 | 
				
			||||||
 | 
					include(joinpath(baseFolder, "src", "Interpreter.jl"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@testset "ExpressionExecutorCuda.jl" begin
 | 
					@testset "ExpressionExecutorCuda.jl" begin
 | 
				
			||||||
	include("ExpressionProcessing.jl")
 | 
						include("ExpressionProcessingTests.jl")
 | 
				
			||||||
 | 
						include("InterpreterTests.jl")
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user