From ec7dabe166fb4e826fc700047698610337c6121d Mon Sep 17 00:00:00 2001 From: coldpeace Date: Wed, 7 Jul 2010 07:58:51 +0000 Subject: [PATCH] edit ruby section git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@7984 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- doc/FAQ.doc | 196 +++++++++++----------------------------------------- 1 file changed, 41 insertions(+), 155 deletions(-) diff --git a/doc/FAQ.doc b/doc/FAQ.doc index 0143959ebb..aecaa28564 100644 --- a/doc/FAQ.doc +++ b/doc/FAQ.doc @@ -2083,89 +2083,49 @@ void MC_assert(int prop); Most of Simgrid modules require a good level in C programming , since simgrid is used to be as standard C library . Sometime ( for some reason or another ) developers prefer using some kind of « easy scripts » - (something like … lua ? Ruby ? ...?) or a language easier to code with ( Java ? ) for their works , + (something like … lua ? Ruby ? ...?) or a language easier to code with ( Java ? ) for their works, which avoid dealing with C errors , and sometime an important gain of time (coding-time?) . -Besides Java Binding , Lua and Ruby bindings are available now( since version 3.4 of Simgrid ) -for MSG Module , and we are currenlty working on bindings for other modules . +Besides Java Binding, Lua and Ruby bindings are available now( since version 3.4 of Simgrid ) +for MSG Module, and we are currenlty working on bindings for other modules . \subsubsection faq_binding_lua_about What is lua ? Lua (Moon for portuguese !) is a lightweight, reflective, imperative and functional programming language, designed as a scripting language with extensible semantics as a primary goal.(see official web site here) \subsubsection faq_binding_lua_why Why lua ? -Lua is a fast,portable and powerful script language , quite simple to use for developpers . +Lua is a fast,portable and powerful script language, quite simple to use for developpers . it combines procedural features with powerful data description facilities, by using a simple, yet powerful, mechanism of tables. Lua has a relatively simple C API compared to other scripting languages, and accordingly it provides a robust, easy to use it. \subsubsection faq_binding_lua_simgrid How to use lua in Simgrid ? -Actually , the use of lua in Simgrid is quite simple , you have just to follow the same steps as coding with C in Simgird , - but this time , code with Lua ;) : +Actually , the use of lua in Simgrid is quite simple, you have just to follow the same steps as coding with C in Simgird, + but this time, code with Lua ;) : - Coding functions coresponding to each process - loading the platforme/deployment XML file that describe the environment of simulation - and … Running the Simulation !!! +\dontinclude lua/master_slave.lua \subsubsection faq_binding_lua_example_master_slave Master/Slave Example + \li Master Code -\verbatim -function Master(...) - nb_task = arg[1]; - comp_size = arg[2]; - comm_size = arg[3]; - slave_count = arg[4] - -- Dispatch the tasks - for i=1,nb_task do - tk = simgrid.Task.new("Task "..i,comp_size,comm_size); - alias = "slave "..(i%slave_count); - simgrid.info("Master sending ’" .. simgrid.Task.name(tk) .."’ To ’" .. alias .."’"); - simgrid.Task.send(tk,alias); - simgrid.info("Master done sending ’".. simgrid.Task.name(tk) .."’ To ’" .. alias .."’"); - end - -- Sending Finalize Message To Others - for i=0,slave_count-1 do - alias = "slave "..i; - simgrid.info("Master: sending finalize to "..alias); - finalize = simgrid.Task.new("finalize",comp_size,comm_size); - simgrid.Task.send(finalize,alias) - end -end -\endverbatim -we mainly use simgrid.Task.new(task_name,computation_size,communication_size) to create our MSG Task , - then simgrid.Task.send(task,alias) to send it . + \until end_of_master +we mainly use simgrid.Task.new(task_name,computation_size,communication_size) to create our MSG Task, + then simgrid.Task.send(task,alias) to send it. we use also simgrid.Task.name(task), to get the task's name . \li Slave Code -\verbatim -function Slave(...) - local my_mailbox="slave "..arg[1] - while true do - local tk = simgrid.Task.recv(my_mailbox); - if (simgrid.Task.name(tk) == "finalize") then - simgrid.info("Slave ’" ..my_mailbox.."’ got finalize msg"); - break - end - simgrid.Task.execute(tk) - end - simgrid.info("Slave ’" ..my_mailbox.."’: I’m Done . See You !!"); -end -\endverbatim -Here , we could see how we use simgrid.Task.recv(alias) to receive a task with a specific alias , +\until end_of_slave +Here, we could see how we use simgrid.Task.recv(alias) to receive a task with a specific alias, this function return directly the task recevied . \li Set Environmenet and run application -\verbatim -require "simgrid" -simgrid.platform("my_platform.xml") -simgrid.application("my_deployment.xml") -simgrid.run() -simgrid.info("Simulation’s over.See you.") -simgrid.clean() -\endverbatim +\until simgrid.clean() \subsubsection faq_binding_lua_example_data Exchanging Data -You can also exchange data between Process using lua .for that , you have to deal with lua task as a table , -since lua is based itself on a mechanism of tables , -so you can exchange any kind of data ( tables, matrix , strings … ) between process via tasks. +You can also exchange data between Process using lua. for that, you have to deal with lua task as a table, +since lua is based itself on a mechanism of tables, +so you can exchange any kind of data ( tables, matrix, strings … ) between process via tasks. \li Sender process \verbatim @@ -2176,8 +2136,8 @@ so you can exchange any kind of data ( tables, matrix , strings … ) between p … simgrid.Task.send(task,alias) \endverbatim - After creating task , we associate to it various kind of data with a specific key , ( string in this case) - to distinguish between data variables . Via this key the receiver could access easily to datas . + After creating task, we associate to it various kind of data with a specific key,( string in this case) + to distinguish between data variables. Via this key the receiver could access easily to datas. \li Receiver processe @@ -2188,16 +2148,16 @@ so you can exchange any kind of data ( tables, matrix , strings … ) between p sender_message = task['message'] ... \endverbatim - Note that in lua , both sender and receiver share the same lua task ! - So that the receiver could joint data directly on the received task without sending it back . + Note that in lua, both sender and receiver share the same lua task! + So that the receiver could joint data directly on the received task without sending it back. You can find a complet example ( matrix multiplication case ) in the file example/lua/mult_matrix.lua \subsubsection faq_binding_lua_example_bypass Bypass XML - maybe you wonder if there is a way to bypass the XML files , - and describe your platform directly from the code , with lua bindings it's Possible !! how ? + maybe you wonder if there is a way to bypass the XML files, + and describe your platform directly from the code, with lua bindings it's Possible !! how ? We provide some additional (tricky?) functions in lua that allows you to set up your own platform without using the XML files - ( this can be useful for large platforms , so a simple for loop will avoid you to deal with an annoying XML File ;) ) + ( this can be useful for large platforms, so a simple for loop will avoid you to deal with an annoying XML File ;) ) \li set Hosts @@ -2232,13 +2192,13 @@ so you can exchange any kind of data ( tables, matrix , strings … ) between p simgrid.Route.new("Jupiter","Bourassa",8,{"0","1","2","3","4","6","7","9"}); ... \endverbatim - for each host you have to specify which route to choose to access to the rest of hosts connected in the grid . + for each host you have to specify which route to choose to access to the rest of hosts connected in the grid. \li Save platform \verbatim simgrid.register_platform(); \endverbatim -Don't forget to register your platform , that SURF callbacks starts their work ;) +Don't forget to register your platform, that SURF callbacks starts their work ;) \li set application \verbatim @@ -2248,30 +2208,27 @@ Don't forget to register your platform , that SURF callbacks starts their work ; simgrid.Host.setFunction("Fafard","Slave",1,{"2"}); simgrid.Host.setFunction("Ginette","Slave",1,{"3"}); \endverbatim - you don't need to use a deployment XML file , thanks to simgrid.Host.setFunction(host_id,function,args_number,args_list) + you don't need to use a deployment XML file, thanks to simgrid.Host.setFunction(host_id,function,args_number,args_list) you can associate functions for each host with arguments if needed . \li \verbatim simgrid.register_application(); \endverbatim -Yes , Here too you have to resgiter your application before running the simulation . +Yes, Here too you have to resgiter your application before running the simulation. the full example is distributed in the file examples/lua/master_slave_bypass.lua \subsection faq_binding_ruby Ruby Binding -\subsubsection faq_binding_ruby_about What is Ruby ? -Ruby is a dynamic, reflective, general purpose object-oriented programming language that combines syntax inspired by Perl with Smalltalk-like features. -Ruby supports multiple programming paradigms, including functional, object oriented, imperative and reflective. It also has a dynamic type system and automatic memory management; -it is therefore similar in varying respects to Python, Perl, Lisp, Dylan, Pike, and CLU.(see official web site here) \subsubsection faq_binding_ruby_simgrid Use Ruby in Simgrid -Since v3.4 , the use of ruby in simgrid is available for the MSG Module . -you can find almost all MSG functionalities in Ruby code , that allows you to set up your environment , manage tasks between hosts and run the simulation. +Since v3.4, the use of ruby in simgrid is available for the MSG Module. +you can find almost all MSG functionalities in Ruby code, that allows you to set up your environment, manage tasks between hosts and run the simulation. +\dontinclude ruby/MasterSlave.rb \subsubsection faq_binding_ruby_example Master/Slave Ruby Application -for each process method(master and slave in this example), you have to associate a ruby class , that should inherit from MSG::Process ruby class, +for each process method(master and slave in this example), you have to associate a ruby class, that should inherit from MSG::Process ruby class, with a 'main' function that describe the behaviour of the process during the simulation. \li required stuff \verbatim @@ -2280,46 +2237,8 @@ include MSG \endverbatim \li Master code -\verbatim -################################################# -# Class Master -################################################# -class Master < MSG::Process - # main : that function that will be executed when running simulation - - def main(args) # args is an array containing arguments for function master - size = args.size - for i in 0..size-1 - MSG::info("args["+String(i)+"]="+args[i]) - end - - raise "Master needs 3 arguments" if size < 3 - numberOfTask = Integer(args[0]) - taskComputeSize = Float(args[1]) - taskCommunicationSize = Float(args[2]) - slaveCount = Integer(args[3]) - - # Creates and sends the tasks - for i in 0..numberOfTask-1 - task = Task.new("Task_"+ i.to_s, taskComputeSize , taskCommunicationSize); - mailbox = "slave " + (i%slaveCount).to_s - MSG::info("Master Sending "+ task.name + " to " + mailbox + " with Comput Size " + - task.compSize.to_s) - task.send(mailbox) - MSG::info("Master Done Sending " + task.name + " to " + mailbox) - end - - # Sending Finalize MSG::Tasks - MSG::info("Master: All tasks have been dispatched. Let's tell everybody the computation is over.") - for i in 0..slaveCount-1 - mailbox = "slave " + i.to_s - finalize_task = Task.new("finalize",0,0) - finalize_task.send(mailbox) - end - MSG::info("Master : Everything's Done") - end -end -\endverbatim +\until end_of_master + the class MSG::Task contains methods that allows the management of the native MSG tasks. in master ruby code we used : - MSG::Task.new(task_name,compute_size,communication_size) : to instanciate a new task. @@ -2327,45 +2246,12 @@ in master ruby code we used : - MSG::Task.name : to get the task's name. \li Slave code -\verbatim -################################################# -# Class Slave -################################################# -class Slave < MSG::Process - - def main(args) - mailbox = "slave " + args[0] - for i in 0..args.size-1 - MSG::debug("args["+String(i)+"]="+args[i]) - end - - while true - task = Task.receive(mailbox) - if (task.name == "finalize") - break - end - task.execute - MSG::debug("Slave '" + mailbox + "' done executing task "+ task.name + ".") - end - MSG::info("I'm done, see you") - end -end -\endverbatim -to receive a task , we use the method MSG::Task.receive(mailbox) that return a MSG:Task object (received task). +\until end_of_slave +to receive a task, we use the method MSG::Task.receive(mailbox) that return a MSG:Task object (received task). \li Main chunk -\verbatim -if (ARGV.length == 2) - MSG.createEnvironment(ARGV[0]) - MSG.deployApplication(ARGV[1]) -else - MSG.createEnvironment("platform.xml") - MSG.deployApplication("deploy.xml") -end -MSG.run -puts "Simulation time : " + MSG.getClock .to_s -MSG.exit -\endverbatim +\until MSG.exit + - MSG.createEnvironment(platform_file) : set up the environment - MSG.deployApplication(deployment_file) : load the deployment file description. - MSG.run : run the simulation @@ -2399,10 +2285,10 @@ you can find a complet example illustrating the use of those methods in file /e \li inheritence - another 'object-oriented' way to do it , is to make your own 'task' class that inherit from MSG::Task , - and contains data you want to deal with , the only 'tricky' thing is that "the initializer" method has no effect ! + another 'object-oriented' way to do it, is to make your own 'task' class that inherit from MSG::Task , + and contains data you want to deal with, the only 'tricky' thing is that "the initializer" method has no effect ! - the use of some getter/setter methods would be the simple way to manage your data :) + the use of some getter/setter methods would be the simple way to manage your data :) \verbatim class PingPongTask < MSG::Task # The initialize method has no effect -- 2.20.1