Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    MultiThread a for loop

    SDK Help
    0
    5
    392
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      On 16/04/2013 at 07:16, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   13/14 
      Platform:   Windows  ;   
      Language(s) :     C++  ;

      ---------
      Hi,

      currently I'm doing a Plugin which is doing an intensive calculation, one part of this calculation is copy a large amount of memory to another memory location with a for loop

      something like:

      for (int lc = 0;lc < 100000000; lc++){

      > NewData[9*lc] = OldData[lc].s[0];
      > NewData[9*lc+1] = OldData[lc].s[1];
      > NewData[9*lc+2] = OldData[lc].s[2];
      >
      >
      > NewData[9*lc+3] = OldData_A[lc].s[0];
      > NewData[9*lc+4] = OldData_A[lc].s[1];
      > NewData[9*lc+5] = OldData_A[lc].s[2];
      >
      >
      > NewData[9*lc+6] = OldData_B[lc].s[0];
      > NewData[9*lc+7] = OldData_B[lc].s[1];
      > NewData[9*lc+8] = OldData_B[lc].s[2];
      }
      >
      >

      I have seen MenuTest.cpp but didn't understand how to do it with a simple for loop
      in simple cases it is just like this

      #pragma omp parallel for num_threads(6)
      and then my for loop

      but found that c4d sdk got problems with OpenMP ...

      thanks in advance
      Mohamed Sakr

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 16/04/2013 at 07:45, xxxxxxxx wrote:

        I have a C++ example of using threading with a while loop on my plugins site: https://sites.google.com/site/scottayersmedia/plugins

        -ScottA

        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          On 16/04/2013 at 08:22, xxxxxxxx wrote:

          You can feed a couple of threads (usually as many as CPUs are available) with packages. They
          all need to know what part of the iteration they need to work on. For example, thread 1 works
          from 0 ... 1000, thread 2 from 1001 to 2000, etc. Make sure you are using locks/semaphores
          wherever it is necessary so you will ever enter a critical section (eg. unsynchronized memory
          writes/reads) pseudo C++ code:

            
            
          class WorkerThread : public C4DThread {
            
              PackageManager* manager;
            
          public:
            
              WorkerThread(PackageManager* manager);
            
              // C4DThread Overrides
            
              void Main();
            
          };
            
          WorkerThread::WorkerThread(PackageManager* manager) : manager(manager) {
          }
            
          WorkerThread::Main() {
              LONG* oldmem = NULL;
              LONG* newmem = NULL;
              LONG count;
              while (!TestBreak() && manager->Fetch(&oldmem, &newmem, &count)) {
                  for (LONG i=0; i < count; i++) {
                      newmen[i] = oldmem[i];
                  }
              }
          }
          

          Best,
          -Niklas

          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

            On 16/04/2013 at 08:50, xxxxxxxx wrote:

            @ Niklas how to use the WorkerThread class in my loop
            what i understand is that WorkerThread::Main() is doing a copy of LONG Array to another LONG Array
            how to use this in parallel?

            assume I'm a complete noob 😄

            1 Reply Last reply Reply Quote 0
            • H
              Helper
              last edited by

              On 16/04/2013 at 09:52, xxxxxxxx wrote:

              The LONG was just a placeholder for the datatype you are using, you need to transfer the example
              to apply it to your use case. You can start multiple threads (allocate an array of WorkerThreads)
              that all recieve the same PackageManager instance (needs to be implemented by you). When
              a WorkerThread has nothing to do it asks the PackageManager for a new package (the old
              memory location, the new memory location and the number of elements) that it can work with
              until the PackageManager tells it that there is nothing actually left to be done.

              -Niklas

              1 Reply Last reply Reply Quote 0
              • First post
                Last post