- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
recently, I started to use the -avx feature and I am trying to transform my applications to simd.
So, I am running into some issues for parallelizing this loop:
#pragma omp simd for (int j=0; j<nParticlesInUse; j++) { if (particles.id != INVALID) { double dx = particles .x - particles.x; double dy = particles .y - particles.y; double r2 = dx * dx + dy * dy; if( r2 > cutoff*cutoff ) { //return; } else { r2 = fmax( r2, min_r*min_r ); double r = sqrt( r2 ); double coef = ( 1 - cutoff / r ) / r2 / mass; particles.ax += coef * dx; particles.ay += coef * dy; if (particles.ax*particles.ax + particles.ay*particles.ay > 10000000) { particles.ax = 0; // here1 particles.ay = 0; // here2 } } } }
I am getting an issue for the assignment in the if clause (here1 and here1):
LOOP BEGIN at particle_simulation.cpp(1413,3)
remark #15336: simd loop was not vectorized: conditional assignment to a scalar [ test.cpp(1436,5) ]
remark #13379: loop was not vectorized with "simd"
remark #25015: Estimate of max trip count of loop=100
LOOP END
I am using icc version 16.
In the Intel guide for vectorizing loops [1] I found this statement. However, I don't know how I can apply it to my situation:
The loop should consist primarily of straight-line code. There should be no jumps or branches such as switch statements, but masked assignments are allowed, including if-then-else constructs that can be interpreted as masked assignments.
Can somebody help me how to handle this if clause? Is there any best practice for these cases?
I am thankful for every pointer/help :)
Best regards
Tim
[1] https://software.intel.com/en-us/articles/requirements-for-vectorizable-loops
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello Tim,
Thank you for your question. From the issue you listed, it appears that the if clause was not vectorized with SIMD correctly. If you'll have a look at this SIMD article, you will see how to adjust your if clause.
Best Regards,
Markus
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello Markus,
thank you for your feedback. I have read the article twice. Unfortunately,
I cannot find any pointer to my specific problem. You mentioned that the loop
was not vectorized correctly. Perhaps you can help me with these two questions:
a) What does the icc compiler means with scalar?
b) Can you describe the error message to me with some other words?
>> simd loop was not vectorized: conditional assignment to a scalar
I don't understand this error message.
Best regards,
Tim
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Tim,
Both questions have already been addressed in this diagnostic, so please take a look at it. This link as well as related articles in it answer both of your questions.
For additional knowledge, I have included this Auto-Vectorization tutorial which I believe might be of more assistance to you.
Best Regards,
Markus
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello Tim(P),
thank you very much for your pointer. I see that you are flying all around in this forum.
Perhaps you can help me with my parallelization issue. I read Markus's diagnostic article
and the "A Guide to Vectorization with Intel C++ Compilers". So, I believe that I got some
basic understanding about vectorization. Unfortunately, I am still not able to fix the loop.
Inserting lastprivate(particles.ax) in the pragma statement leads to
the error:
particle_simulation.cpp(1413): error: invalid entity for this variable list in omp clause
#pragma omp simd lastprivate(particles.ax)
Do you know if the variable must have an arithmetic data type like int, float, double,... etc.?
Cheers!
Tim(S)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Okay, I could find the issue :) Problem solved :) thanks for all the pointers and help.
Best regards,
Tim

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page