<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Parallel Image Processing in OpenMP - Image Blocks in Intel® Integrated Performance Primitives</title>
    <link>https://community.intel.com/t5/Intel-Integrated-Performance/Parallel-Image-Processing-in-OpenMP-Image-Blocks/m-p/998507#M23006</link>
    <description>&lt;P&gt;Parallel Image Processing in OpenMP - Image Blocks&lt;/P&gt;

&lt;P&gt;Hello,&lt;BR /&gt;
	I'm doing my first steps in the OpenMP world.&lt;/P&gt;

&lt;P&gt;I have an image I want to apply a filter on.&lt;BR /&gt;
	Since the image is large I wanted to break it into blocks and apply the filter on each independently in parallel.&lt;BR /&gt;
	Namely, I'm creating 4 images I want to have different threads.&lt;/P&gt;

&lt;P&gt;I'm using Intel IPP for the handling of the images and the function to apply on each sub image.&lt;/P&gt;

&lt;P&gt;I described the code here:&lt;/P&gt;

&lt;P&gt;&lt;A href="http://stackoverflow.com/questions/29319226/parallel-image-processing-in-openmp-splitting-image" target="_blank"&gt;http://stackoverflow.com/questions/29319226/parallel-image-processing-in-openmp-splitting-image&lt;/A&gt;&lt;/P&gt;

&lt;P&gt;The problem is I tried both sections and parallel for and got only 20% improvement.&lt;/P&gt;

&lt;P&gt;What am I doing wrong?&lt;BR /&gt;
	How can I tell each "Worker" that though data is taken from the same array, it is safe to read (Data won't change) and write (Each worker has exclusive approach to its part of the result image).&lt;/P&gt;

&lt;P&gt;Thank You.&lt;/P&gt;</description>
    <pubDate>Sat, 28 Mar 2015 20:03:48 GMT</pubDate>
    <dc:creator>Royi</dc:creator>
    <dc:date>2015-03-28T20:03:48Z</dc:date>
    <item>
      <title>Parallel Image Processing in OpenMP - Image Blocks</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/Parallel-Image-Processing-in-OpenMP-Image-Blocks/m-p/998507#M23006</link>
      <description>&lt;P&gt;Parallel Image Processing in OpenMP - Image Blocks&lt;/P&gt;

&lt;P&gt;Hello,&lt;BR /&gt;
	I'm doing my first steps in the OpenMP world.&lt;/P&gt;

&lt;P&gt;I have an image I want to apply a filter on.&lt;BR /&gt;
	Since the image is large I wanted to break it into blocks and apply the filter on each independently in parallel.&lt;BR /&gt;
	Namely, I'm creating 4 images I want to have different threads.&lt;/P&gt;

&lt;P&gt;I'm using Intel IPP for the handling of the images and the function to apply on each sub image.&lt;/P&gt;

&lt;P&gt;I described the code here:&lt;/P&gt;

&lt;P&gt;&lt;A href="http://stackoverflow.com/questions/29319226/parallel-image-processing-in-openmp-splitting-image" target="_blank"&gt;http://stackoverflow.com/questions/29319226/parallel-image-processing-in-openmp-splitting-image&lt;/A&gt;&lt;/P&gt;

&lt;P&gt;The problem is I tried both sections and parallel for and got only 20% improvement.&lt;/P&gt;

&lt;P&gt;What am I doing wrong?&lt;BR /&gt;
	How can I tell each "Worker" that though data is taken from the same array, it is safe to read (Data won't change) and write (Each worker has exclusive approach to its part of the result image).&lt;/P&gt;

&lt;P&gt;Thank You.&lt;/P&gt;</description>
      <pubDate>Sat, 28 Mar 2015 20:03:48 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/Parallel-Image-Processing-in-OpenMP-Image-Blocks/m-p/998507#M23006</guid>
      <dc:creator>Royi</dc:creator>
      <dc:date>2015-03-28T20:03:48Z</dc:date>
    </item>
    <item>
      <title>Hello, </title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/Parallel-Image-Processing-in-OpenMP-Image-Blocks/m-p/998508#M23007</link>
      <description>&lt;P&gt;Hello,&amp;nbsp;&lt;/P&gt;

&lt;P&gt;When I quickly check the code, one thing I note is that the code is not handling the image border. Is this some bug there?&lt;SPAN style="font-size: 1em; line-height: 1.5;"&gt;&lt;A href="http://scc.qibebt.cas.cn/docs/compiler/intel/2011/ipp/ipp_manual/IPPI/ippi_ch9/ch9_borders.htm" target="_blank"&gt;http://scc.qibebt.cas.cn/docs/compiler/intel/2011/ipp/ipp_manual/IPPI/ippi_ch9/ch9_borders.htm&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;

&lt;P&gt;&lt;SPAN style="font-size: 1em; line-height: 1.5;"&gt;Also how Intel IPP is linked in the code, &amp;nbsp;dynamic, or static?&lt;/SPAN&gt;&lt;/P&gt;

&lt;P&gt;Also to further checking the threading behavior, &amp;nbsp;I also to use some performance tools, like Intel vtune to understand how this code is running the processors, and see if it is really executed in parallelism.&lt;/P&gt;

&lt;P&gt;Thanks,&lt;BR /&gt;
	Chao &amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 01 Apr 2015 06:35:54 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/Parallel-Image-Processing-in-OpenMP-Image-Blocks/m-p/998508#M23007</guid>
      <dc:creator>Chao_Y_Intel</dc:creator>
      <dc:date>2015-04-01T06:35:54Z</dc:date>
    </item>
    <item>
      <title>Hi Royi,</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/Parallel-Image-Processing-in-OpenMP-Image-Blocks/m-p/998509#M23008</link>
      <description>&lt;P&gt;Hi Royi,&lt;/P&gt;

&lt;P&gt;make sure that use static linking with non-threaded ippi library. In this way you can use the next approach:&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int height&amp;nbsp; = dstRoiSize.height;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int width&amp;nbsp;&amp;nbsp; = dstRoiSize.width;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ipp32f *pSrc1, *pDst1;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nThreads, cH, cT;&lt;/P&gt;

&lt;P&gt;#pragma omp parallel&amp;nbsp; shared( pSrc, pDst, nThreads, width, height, kernelSize,\&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xAnchor, cH, cT ) private( pSrc1, pDst1 )&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; #pragma omp master&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nThreads = omp_get_num_threads();&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cH = height / nThreads;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cT = height % nThreads;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; #pragma omp barrier&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int curH;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int id = omp_get_thread_num();&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pSrc1 = (Ipp32f*)( (Ipp8u*)pSrc + id * cH * srcStep );&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDst1 = (Ipp32f*)( (Ipp8u*)pDst + id * cH * dstStep );&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( id != ( nThreads - 1 )) curH = cH;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else curH = cH + cT;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ippiFilterRow_32f_C1R( pSrc1, srcStep, pDst1, dstStep,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; width, curH, pKernel, kernelSize, xAnchor );&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;

&lt;P&gt;"master" region is required for calculating an amount of work for each thread, after "barrier" each thread can calculate the region of image to process (independently). You see OMP keywords "shared" and "private" in the parallel region declaration to distinguish shared and private variables.&lt;/P&gt;

&lt;P&gt;regards, Igor&lt;/P&gt;</description>
      <pubDate>Wed, 01 Apr 2015 08:26:59 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/Parallel-Image-Processing-in-OpenMP-Image-Blocks/m-p/998509#M23008</guid>
      <dc:creator>Igor_A_Intel</dc:creator>
      <dc:date>2015-04-01T08:26:59Z</dc:date>
    </item>
    <item>
      <title>Hi Igor,</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/Parallel-Image-Processing-in-OpenMP-Image-Blocks/m-p/998510#M23009</link>
      <description>&lt;P&gt;Hi Igor,&lt;/P&gt;

&lt;P&gt;Is this the approach in your Multi Threaded versions?&lt;BR /&gt;
	What are the performance gain with your code, have you tried it?&lt;/P&gt;

&lt;P&gt;This was very helpful.&lt;/P&gt;

&lt;P&gt;Thank You!&lt;/P&gt;</description>
      <pubDate>Sat, 04 Apr 2015 06:45:38 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/Parallel-Image-Processing-in-OpenMP-Image-Blocks/m-p/998510#M23009</guid>
      <dc:creator>Royi</dc:creator>
      <dc:date>2015-04-04T06:45:38Z</dc:date>
    </item>
    <item>
      <title>Hi Royi,</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/Parallel-Image-Processing-in-OpenMP-Image-Blocks/m-p/998511#M23010</link>
      <description>&lt;P&gt;Hi Royi,&lt;/P&gt;

&lt;P&gt;yes, this approach is used in ippiFilterXXX functions - you can compare IPP threaded and non-threaded libraries to see the gain. You can use IPP performance system for this purpose (PS) that is a part of each IPP release. I see up to ~2.2x speedup on my laptop (HSWx2 + HT on)&amp;nbsp;for ippiFilter_32f_C1R for masksize 3x3 and 720x480 roi.&lt;/P&gt;

&lt;P&gt;regards, Igor&lt;/P&gt;</description>
      <pubDate>Thu, 09 Apr 2015 09:20:14 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/Parallel-Image-Processing-in-OpenMP-Image-Blocks/m-p/998511#M23010</guid>
      <dc:creator>Igor_A_Intel</dc:creator>
      <dc:date>2015-04-09T09:20:14Z</dc:date>
    </item>
  </channel>
</rss>

