|
Hi,
I've been googling for hours without finding anything, so I have to turn here! (Frequent reader, first time poster).
I have a VB.net class (myMechModel) that is used to solve a mechanical problem. The class contains all (mechanical) parameters (mass, stiffness, length) are needed to solve the problem and it stores the results in a collection within the class. The class has a method that is being called to run the simulation (myMechModel.Calculate()).
I now want to run multiple simulations of the simulation, but change some of the parameters between each simulation. I could run it sequentially, but I really want to run it in parallel (each simulation run takes about 2 second).
I've been trying to get it working with Parallel.Tasks, but of course calling myMechModel.Calculate() just results in a threading conflict because multiple threads try to write results to the same results collection.
I've been looking into cloning the initial class for each task and then changing the values I want (like mass, stiffness, length). But before I go down that path, I'd like to here comments on what would be the best way of dealing with this!
|
|
|
|
|
2 seconds a run isn't really long enough to be multithreading a single Calculate. What would work is create a number of threads, say one for each processor core in the system, each with its own myMechModel instance, and let each instance do an entire range of parameters.
So, basically, N threads each with a myMechModel, and each thread repeats: { set parameters, run Calculate } for a range of parameters that you want. That way, each thread should be busy for a while and you might be able to benefit from multithreading.
Of course, you need to be interested in running enough calculations before it becomes interesting.
|
|
|
|
|
Thanks for the comments,
I just want to clarify somethings:
* Each run of myMechModel.Calculate() takes about 2 seconds
* I need to run parameter sweeps (mass going from 100-200 in 4 steps, stiffness going from 100-200 in 4 steps etc).
* If I run it all on a single instance of myMechModel on a single thread, I'm talking 10+ seconds.
I think the main problem I have is to figure out how many instances to create, because the number of simulations might vary quite a bit. Should I see how many threads the computer runs, create that many instances and manually setup all the runs on the different threads.
I'd much rather use something more automated/efficient such as the Task Parallel Library, is there anything I could do to use that?
Final questions, I've read about IClonable, is that the way to go to create instances of myMechModel?
|
|
|
|
|
Assuming each simulation takes a small amount of input data, and generates a significant amount of output data, this is what I would do:
- create a single queue with "jobs" (instances of a Job class), each job describing one simulation, with the associated input values;
- have N threads each executing the same code, basically a loop getting a job from the job queue (needs a lock while dequeueing, not while simulating); have each thread stuff its results in:
= the Job object itself, if that is reasonnable (depends on amount and kind of results);
= its own output container (a queue, a file, whatever);
= a shared resource, such as a database.
- launch these N threads where N would equal the number of processors available (i.e. Environment.ProcessorCount), or the number of processors you willing to spend to this work.
- if necessary, have some post-processing that collects all the results, sorts them in the order you want, etc.
The one thing you must watch out for, is results requiring locks for too long a period (in case you use a shared output container), causing other threads to stall.
BTW: if there are many jobs, there is no need to first stuff them all in a queue, you could as well have a separate process that continues to feed the job queue while your simulator threads are already processing some jobs.
Note: if the calculating threads have reasons to stall (e.g. they need file, network, or database data) then you should observe the processor load (with Task Manager) and basically raise N till the CPU is fully loaded. Adding more threads beyond that point isn't going to improve things, and may even work against you.
|
|
|
|
|
i need to run a encryption and decryption algorithm which is written in c language and call the exe file in vb.net and show the output in form window.
|
|
|
|
|
|
Good link...
I quit being afraid when my first venture failed and the sky didn't fall down.
|
|
|
|
|
you gave a -ive vote...
|
|
|
|
|
prdshukla wrote:
you gave a -ive vote...
How do you know it was him? It could have been anybody.
|
|
|
|
|
yeah..you are right...but may be by mistake he may have done it..
The rating process is not very intuitive...
|
|
|
|
|
How can Good Answer, Bad Answer not be intuitive? It's hard to see how it could be any easier.
BTW - it looks like it was two people who didn't like your answer.
|
|
|
|
|
You may have received the 1s because he says it's an EXE, not a DLL.
|
|
|
|
|
Perhaps this[^] might be of use? (At least the concepts involved might be what you want.)
|
|
|
|
|
<DllImport("E:\Temp\simple.dll", CallingConvention:="CallingConvention.Cdecl)"> _
Private Shared Sub ReturnInParam(ByRef Stan As Integer, _
ByRef Message As String)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim Num As Integer = 8
Dim Message As String = "Harun"
ReturnInParam(Num, Message)
MessageBox.Show(Message)
End Sub
|
|
|
|
|
You can run the exe in the shell, but I'm not sure about the cmd window. I didnt need it, but thi scode will scrape the hidden cmd box for the shel output, in whichyou can regex the return values.
Private Function Shell_Exceute_FLV(ByVal Parameters_FFMpeg As String) As String
Dim Context As HttpContext = HttpContext.Current
Dim SB_FFMpeg As StringBuilder = New StringBuilder
Try
Dim Results As String = Nothing
Dim ffmpeg As New Process()
Dim ffmpeg_StartInfo As New ProcessStartInfo(Path_FFMPEG, Parameters_FFMpeg)
ffmpeg_StartInfo.UseShellExecute = False
ffmpeg_StartInfo.RedirectStandardError = True
ffmpeg_StartInfo.RedirectStandardOutput = True
ffmpeg.StartInfo = ffmpeg_StartInfo
ffmpeg.Start()
Dim ffmpeg_StreamReader As IO.StreamReader = ffmpeg.StandardError
SB_FFMpeg = New StringBuilder()
SB_FFMpeg.Append(ffmpeg_StreamReader.ReadToEnd().ToString())
Do While Not ffmpeg.WaitForExit(1000)
SB_FFMpeg.Append(ffmpeg_StreamReader.ReadToEnd().ToString())
Loop
If ffmpeg.ExitCode = 0 Then
ffmpeg.Close()
If Not ffmpeg_StreamReader Is Nothing Then
ffmpeg_StreamReader.Close()
End If
Else
ffmpeg.Close()
If Not ffmpeg_StreamReader Is Nothing Then
ffmpeg_StreamReader.Close()
End If
End If
ffmpeg.Close()
ffmpeg.Dispose()
ffmpeg = Nothing
Catch ex As Exception
End Try
Return SB_FFMpeg.ToString
End Function
|
|
|
|
|
hi every body!
I'm using Enterprise Library caching (memory caching) in my project. every thing works OK but when the application starts up for the first time I have a none ignorable delay! I can not understand the reason
every suggestion would be appreciated
|
|
|
|
|
Caches take time to fill up, to overcome this fill your cache on a separate thread.
Its the man, not the machine - Chuck Yeager
If at first you don't succeed... get a better publicist
If the final destination is death, then we should enjoy every second of the journey.
|
|
|
|
|
You should define priority of the data and load only the most important data while starting the App\service and put rest of the data load process on a background worker thread.
And it would be better if you do caching on server side rather than on client side. In case if it's really required to have a client caching, try using a different alternate something like SQL compact DB which could be shipped with the release binary rather than getting loaded each time when the App is launched.
Hope it helps.
|
|
|
|
|
Hi all again,
I'm focussing on the problem of persistence encapsulation with ADO.NET EF. AFAIK Entity Data Model (EDM) is another layer contains entities and associations... but where persistence is in fact encapsulated? If I work with POCO is correct to argue that persistence (and data access) is obtained in the ObjectContext where an EntitySQL or a LINQ to entities query will return an EntityObject?
I'm basing this assumption on this table[^]
Thanks
Ste
Ste
|
|
|
|
|
How to Forward Email by programattically?
Thanks
Alok Kumar Sharma
|
|
|
|
|
|
I made a change to an XML schema on a website; the file is located in App_Data/Schemas . It was the first of eight that the site uses, and the change involved adding a new element.
Now, opening any source file on the site results in a warning: Errors occured while compiling the Xml schemas in the project. Because of this, Xml intellisense is not available. There is no line or column number in the warning, and as far as I can tell, Intellisense on the linked XML files works just fine.
The weird thing is, I deleted the schema and restarted VS. Now I get the same warning on the schema that is now at the top of the list. I created a new, empty schema using the Add New wizard, gave it a name that put it at the top of the list, and now it is throwing the warning. I deleted that text and manually typed in the deleted schema, renamed the file and saved it, and it is still throwing the warning.
This is ridiculous.
It would seem that the compiler itself is bugged. How can I go about getting rid of this warning, without having to turn off display of all warnings?
|
|
|
|
|
I've been getting the same error for a few weeks now (although using VS2010). I haven't been able to track it down, and the error just opens the schema, but doesn't highlight any errors. Nothing is actually failing, and at this point (until something actually does fail), I'm chalking it up to a mystery bug somewhere in the IDE.
Shocking, I know. I'll bet that somehow, next time VS updates, it just as mysteriously disappears.
|
|
|
|
|
During batch job processing i found lots of Deadlock occurance in logfile. Is it code issue or Database setting issue. I have 2-thread two-core CPU.
I am running this batch with 2-threads and maximum batch-size=1000.
In database setting for initrans=5 and maxtrans=250.
It causes when I run batch process with hundreds of thousands records. Please help me here.
LogFile error
General Level="High" Type="Custom" Severity="Notice" TimeStamp="2011-08-30 09:54:45" Message="WD: FAILED: An exception was caught during the execution of an action query: ORA-00060: deadlock detected while waiting for resource
. Check InnerException, QueryExecuted and Parameters of this exception to examine the cause of this exception. ---
|
|
|
|
|
The deadlock occurs when two or more sessions wait for the locks that are held by the opposite session. For more info,: http://www.oracle-base.com/articles/misc/Deadlocks.php[^].
Deadlock is a code issue. The best way to avoid deadlock is to make the changes to the tables always in the same order.
If you run a batch modifications, one possibility could be to lock the entire table before the batch starts. However the downside is that no-one can make modifications to this table while your batch is running.
|
|
|
|