<?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 Optimization kernel for HD4000 in OpenCL* for CPU</title>
    <link>https://community.intel.com/t5/OpenCL-for-CPU/Optimization-kernel-for-HD4000/m-p/767089#M90</link>
    <description>&lt;DIV id="_mcePaste"&gt;Hello,&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;As the NDA seems to be over, I have few questions about HD4000 and OpenCL.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;I am testing performances of HD4000 embedded into IVB (i7 3720QM), with OpenCL GPU. I try to find the best efficient scheme of kernel for picture analysis, which is used for h264 encoding.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;The operations I want to compute are very simple, it's basicly made of differences of grayscale pixels values between 2 different frames, or into one same frame. And accumulate the result over HD pictures (1920*1080).&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;My experimentations led me to use image2d obj. I read 2 pixels values from global memory, make the operation and store result into local memory. And finally I do the reduction into the kernel, and write the result into global memory.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;It appears that the reduction is the most important part in term of execution time, which leads to quite "bad" result to my opinion.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;My optimized version of kernel for GPU hardly beats the CPU version. And it's quite far from OpenMP performances.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;As there is no tool such as GPA which supports HD4000 with OpenCL, and the offline compiler does not provide the assembly code, it is not easy to understand the behaviour and optimize.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;Then I am wondering if I could expect to get much more performances from the HD4000 ?&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;Here is my kernel:&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__kernel void ker1_MIX_c_img2d (&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;const int stride,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;read_only image2d_t pix,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;read_only image2d_t pix1,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;read_only image2d_t pix2,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__global uint* p_fladIntra_sum,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__global uint* p_fladInter1_sum,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__global uint* p_fladInter2_sum,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__global uint* p_fldc_sum,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__local int4* localmem_fladIntra,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__local int4* localmem_fladInter1,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__local int4* localmem_fladInter2,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__local int4* localmem_fldc,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;const int localSize,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;const int rest_x,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;const int rest_y)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;{&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;const sampler_t samplerA = CLK_NORMALIZED_COORDS_FALSE |&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;			CLK_ADDRESS_CLAMP |&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;			CLK_FILTER_NEAREST;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int4 tmp_Intra;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int4 tmp_Inter1;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int4 tmp_Inter2;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int4 tmp_Fldc;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int g_i= get_global_id(1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int g_j = get_global_id(0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int l_i= get_local_id(1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int l_j = get_local_id(0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int gid_i= get_group_id(1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int gid_j= get_group_id(0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int wg_i=get_num_groups (1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int wg_j=get_num_groups (0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int l_size_i = get_local_size(1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int l_size_j = get_local_size(0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int g_size_i = get_global_size(1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int g_size_j = get_global_size(0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;//Load data and perform FLAD&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;if(g_j%2==0 &amp;amp;&amp;amp; g_j&lt;G_SIZE_J-1&gt;&lt;/G_SIZE_J-1&gt;&lt;/I&gt;&lt;/B&gt;&lt;I&gt;&lt;/I&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fladIntra[(l_j/2)*l_size_i+l_i]=convert_int4(abs(read_imagei(pix, samplerA, (int2)(g_i, g_j)) - read_imagei(pix, samplerA, (int2)(g_i, g_j+1))));&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fladInter1[l_j*l_size_i+l_i]=convert_int4(abs(read_imagei(pix, samplerA, (int2)(g_i, g_j)) - read_imagei(pix1, samplerA, (int2)(g_i, g_j))));&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fladInter2[l_j*l_size_i+l_i]=convert_int4(abs(read_imagei(pix, samplerA, (int2)(g_i, g_j)) - read_imagei(pix2, samplerA, (int2)(g_i, g_j))));&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fldc[l_j*l_size_i+l_i]=convert_int4(abs(read_imagei(pix, samplerA, (int2)(g_i, g_j)) ));&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;#ifndef SKIP_REDUCTION&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;/* ########################################################################*/&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;barrier(CLK_LOCAL_MEM_FENCE);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;/* #######################################################################*/&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;// repeat reduction in local memory&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;for(int s = localSize&amp;gt;&amp;gt;1; s &amp;gt; 1; s &amp;gt;&amp;gt;= 1)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;{&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	//skip non-valide values from partially filled workgroups (last WG of each dimension&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	if(l_j*l_size_i+l_i&amp;lt; s)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	{&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;		if(s &amp;lt;= localSize&amp;gt;&amp;gt;2)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;		localmem_fladIntra[l_j*l_size_i+l_i] += localmem_fladIntra[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;		&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;		localmem_fladInter1[l_j*l_size_i+l_i] += localmem_fladInter1[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;		localmem_fladInter2[l_j*l_size_i+l_i] += localmem_fladInter2[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;		localmem_fldc[l_j*l_size_i+l_i] += localmem_fldc[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;		&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	// keep barrier outside conditional&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;/* ###################################################################*/&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	barrier(CLK_LOCAL_MEM_FENCE);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;/* ####################################################################*/&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;#endif //SKIP_REDUCTION&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;// write result to global memory&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;if (l_i== 0 &amp;amp;&amp;amp; l_j==0) //&amp;amp;&amp;amp; (gid_i &amp;lt; (wg_i-1) || rest_x==0) &amp;amp;&amp;amp; (gid_j &amp;lt; (wg_j-1) || rest_y==0))&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;{&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Intra=(localmem_fladIntra[0] + localmem_fladIntra[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Inter1=(localmem_fladInter1[0] + localmem_fladInter1[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Inter2=(localmem_fladInter2[0] + localmem_fladInter2[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Fldc=(localmem_fldc[0] + localmem_fldc[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fladIntra_sum[gid_j*wg_i + gid_i] =tmp_Intra.s0 + tmp_Intra.s1 + tmp_Intra.s2 + tmp_Intra.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fladInter1_sum[gid_j*wg_i + gid_i] =tmp_Inter1.s0 + tmp_Inter1.s1 + tmp_Inter1.s2 + tmp_Inter1.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fladInter2_sum[gid_j*wg_i + gid_i] =tmp_Inter2.s0 + tmp_Inter2.s1 + tmp_Inter2.s2 + tmp_Inter2.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fldc_sum[gid_j*wg_i + gid_i] =tmp_Fldc.s0 + tmp_Fldc.s1 + tmp_Fldc.s2 + tmp_Fldc.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV&gt;I use workgroup size of 128 x 2, which is the best after testing different sizes.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;The execution time is about 2.25ms for this kernel. I do not take into account the time for data transfert which is about 2ms.&lt;/DIV&gt;&lt;DIV&gt;The reduction uses 1.5ms of GPU time.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Also, as I am measuring it from a desktop computer which has no other graphic card, is there some king of configuration I should use during the measurements, no to disturb the GPU?&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Thank you.&lt;/DIV&gt;&lt;DIV&gt;Chris&lt;/DIV&gt;</description>
    <pubDate>Thu, 26 Apr 2012 16:19:25 GMT</pubDate>
    <dc:creator>christolb29</dc:creator>
    <dc:date>2012-04-26T16:19:25Z</dc:date>
    <item>
      <title>Optimization kernel for HD4000</title>
      <link>https://community.intel.com/t5/OpenCL-for-CPU/Optimization-kernel-for-HD4000/m-p/767089#M90</link>
      <description>&lt;DIV id="_mcePaste"&gt;Hello,&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;As the NDA seems to be over, I have few questions about HD4000 and OpenCL.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;I am testing performances of HD4000 embedded into IVB (i7 3720QM), with OpenCL GPU. I try to find the best efficient scheme of kernel for picture analysis, which is used for h264 encoding.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;The operations I want to compute are very simple, it's basicly made of differences of grayscale pixels values between 2 different frames, or into one same frame. And accumulate the result over HD pictures (1920*1080).&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;My experimentations led me to use image2d obj. I read 2 pixels values from global memory, make the operation and store result into local memory. And finally I do the reduction into the kernel, and write the result into global memory.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;It appears that the reduction is the most important part in term of execution time, which leads to quite "bad" result to my opinion.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;My optimized version of kernel for GPU hardly beats the CPU version. And it's quite far from OpenMP performances.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;As there is no tool such as GPA which supports HD4000 with OpenCL, and the offline compiler does not provide the assembly code, it is not easy to understand the behaviour and optimize.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;Then I am wondering if I could expect to get much more performances from the HD4000 ?&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;Here is my kernel:&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__kernel void ker1_MIX_c_img2d (&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;const int stride,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;read_only image2d_t pix,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;read_only image2d_t pix1,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;read_only image2d_t pix2,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__global uint* p_fladIntra_sum,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__global uint* p_fladInter1_sum,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__global uint* p_fladInter2_sum,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__global uint* p_fldc_sum,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__local int4* localmem_fladIntra,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__local int4* localmem_fladInter1,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__local int4* localmem_fladInter2,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;__local int4* localmem_fldc,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;const int localSize,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;const int rest_x,&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;const int rest_y)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;{&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;const sampler_t samplerA = CLK_NORMALIZED_COORDS_FALSE |&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;			CLK_ADDRESS_CLAMP |&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;			CLK_FILTER_NEAREST;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int4 tmp_Intra;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int4 tmp_Inter1;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int4 tmp_Inter2;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int4 tmp_Fldc;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int g_i= get_global_id(1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int g_j = get_global_id(0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int l_i= get_local_id(1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int l_j = get_local_id(0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int gid_i= get_group_id(1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int gid_j= get_group_id(0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int wg_i=get_num_groups (1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int wg_j=get_num_groups (0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int l_size_i = get_local_size(1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int l_size_j = get_local_size(0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int g_size_i = get_global_size(1);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;int g_size_j = get_global_size(0);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;//Load data and perform FLAD&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;if(g_j%2==0 &amp;amp;&amp;amp; g_j&lt;G_SIZE_J-1&gt;&lt;/G_SIZE_J-1&gt;&lt;/I&gt;&lt;/B&gt;&lt;I&gt;&lt;/I&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fladIntra[(l_j/2)*l_size_i+l_i]=convert_int4(abs(read_imagei(pix, samplerA, (int2)(g_i, g_j)) - read_imagei(pix, samplerA, (int2)(g_i, g_j+1))));&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fladInter1[l_j*l_size_i+l_i]=convert_int4(abs(read_imagei(pix, samplerA, (int2)(g_i, g_j)) - read_imagei(pix1, samplerA, (int2)(g_i, g_j))));&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fladInter2[l_j*l_size_i+l_i]=convert_int4(abs(read_imagei(pix, samplerA, (int2)(g_i, g_j)) - read_imagei(pix2, samplerA, (int2)(g_i, g_j))));&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fldc[l_j*l_size_i+l_i]=convert_int4(abs(read_imagei(pix, samplerA, (int2)(g_i, g_j)) ));&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;#ifndef SKIP_REDUCTION&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;/* ########################################################################*/&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;barrier(CLK_LOCAL_MEM_FENCE);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;/* #######################################################################*/&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;// repeat reduction in local memory&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;for(int s = localSize&amp;gt;&amp;gt;1; s &amp;gt; 1; s &amp;gt;&amp;gt;= 1)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;{&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	//skip non-valide values from partially filled workgroups (last WG of each dimension&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	if(l_j*l_size_i+l_i&amp;lt; s)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	{&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;		if(s &amp;lt;= localSize&amp;gt;&amp;gt;2)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;		localmem_fladIntra[l_j*l_size_i+l_i] += localmem_fladIntra[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;		&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;		localmem_fladInter1[l_j*l_size_i+l_i] += localmem_fladInter1[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;		localmem_fladInter2[l_j*l_size_i+l_i] += localmem_fladInter2[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;		localmem_fldc[l_j*l_size_i+l_i] += localmem_fldc[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;		&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	// keep barrier outside conditional&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;/* ###################################################################*/&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;	barrier(CLK_LOCAL_MEM_FENCE);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;/* ####################################################################*/&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;#endif //SKIP_REDUCTION&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;// write result to global memory&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;if (l_i== 0 &amp;amp;&amp;amp; l_j==0) //&amp;amp;&amp;amp; (gid_i &amp;lt; (wg_i-1) || rest_x==0) &amp;amp;&amp;amp; (gid_j &amp;lt; (wg_j-1) || rest_y==0))&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;{&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Intra=(localmem_fladIntra[0] + localmem_fladIntra[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Inter1=(localmem_fladInter1[0] + localmem_fladInter1[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Inter2=(localmem_fladInter2[0] + localmem_fladInter2[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Fldc=(localmem_fldc[0] + localmem_fldc[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fladIntra_sum[gid_j*wg_i + gid_i] =tmp_Intra.s0 + tmp_Intra.s1 + tmp_Intra.s2 + tmp_Intra.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fladInter1_sum[gid_j*wg_i + gid_i] =tmp_Inter1.s0 + tmp_Inter1.s1 + tmp_Inter1.s2 + tmp_Inter1.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fladInter2_sum[gid_j*wg_i + gid_i] =tmp_Inter2.s0 + tmp_Inter2.s1 + tmp_Inter2.s2 + tmp_Inter2.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fldc_sum[gid_j*wg_i + gid_i] =tmp_Fldc.s0 + tmp_Fldc.s1 + tmp_Fldc.s2 + tmp_Fldc.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV&gt;I use workgroup size of 128 x 2, which is the best after testing different sizes.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;The execution time is about 2.25ms for this kernel. I do not take into account the time for data transfert which is about 2ms.&lt;/DIV&gt;&lt;DIV&gt;The reduction uses 1.5ms of GPU time.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Also, as I am measuring it from a desktop computer which has no other graphic card, is there some king of configuration I should use during the measurements, no to disturb the GPU?&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Thank you.&lt;/DIV&gt;&lt;DIV&gt;Chris&lt;/DIV&gt;</description>
      <pubDate>Thu, 26 Apr 2012 16:19:25 GMT</pubDate>
      <guid>https://community.intel.com/t5/OpenCL-for-CPU/Optimization-kernel-for-HD4000/m-p/767089#M90</guid>
      <dc:creator>christolb29</dc:creator>
      <dc:date>2012-04-26T16:19:25Z</dc:date>
    </item>
    <item>
      <title>Optimization kernel for HD4000</title>
      <link>https://community.intel.com/t5/OpenCL-for-CPU/Optimization-kernel-for-HD4000/m-p/767090#M91</link>
      <description>Is it possible to unroll the following loop? &lt;B&gt;&lt;I&gt;"for(int s = localSize&amp;gt;&amp;gt;1; s &amp;gt; 1; s &amp;gt;&amp;gt;= 1)"&lt;/I&gt;&lt;/B&gt;</description>
      <pubDate>Thu, 26 Apr 2012 18:08:33 GMT</pubDate>
      <guid>https://community.intel.com/t5/OpenCL-for-CPU/Optimization-kernel-for-HD4000/m-p/767090#M91</guid>
      <dc:creator>Jim_Vaughn</dc:creator>
      <dc:date>2012-04-26T18:08:33Z</dc:date>
    </item>
    <item>
      <title>Optimization kernel for HD4000</title>
      <link>https://community.intel.com/t5/OpenCL-for-CPU/Optimization-kernel-for-HD4000/m-p/767091#M92</link>
      <description>Yes, I tried the following expression :&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;B&gt;&lt;I&gt;#pragma unroll 7&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;B&gt;&lt;I&gt;for(int s = localSize&amp;gt;&amp;gt;1; s &amp;gt; 1; s &amp;gt;&amp;gt;= 1)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV&gt;But I measure no gain, then I am not sure if it really works, as I cannot see the assembly code.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;My question is why the reduction needs so much time with the GPU. For instance, my optimized GPU version of the kernel (the one above) needs a total of 2.25ms per frame, with more than 1.5ms for the reduction.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Whereas on CPU, the total is a bit slower (2.6ms), but the same reduction needs only 600us.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;The big difference is the vector length, because I can use vload16 on CPU.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Thank you.&lt;/DIV&gt;</description>
      <pubDate>Fri, 27 Apr 2012 08:02:20 GMT</pubDate>
      <guid>https://community.intel.com/t5/OpenCL-for-CPU/Optimization-kernel-for-HD4000/m-p/767091#M92</guid>
      <dc:creator>christolb29</dc:creator>
      <dc:date>2012-04-27T08:02:20Z</dc:date>
    </item>
    <item>
      <title>Optimization kernel for HD4000</title>
      <link>https://community.intel.com/t5/OpenCL-for-CPU/Optimization-kernel-for-HD4000/m-p/767092#M93</link>
      <description>Thanks for the report,&lt;DIV&gt;Our support team will look into this issue,&lt;/DIV&gt;&lt;DIV&gt;In the meanwhile I suggest to go over the&lt;A href="http://software.intel.com/sites/landingpage/opencl/optimization-guide/index.htm"&gt;OpenCL* Optimization Guide&lt;/A&gt;and see if details inside can help you.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Regards,&lt;/DIV&gt;&lt;DIV&gt;- Arnon&lt;/DIV&gt;</description>
      <pubDate>Mon, 30 Apr 2012 13:59:10 GMT</pubDate>
      <guid>https://community.intel.com/t5/OpenCL-for-CPU/Optimization-kernel-for-HD4000/m-p/767092#M93</guid>
      <dc:creator>ARNON_P_Intel</dc:creator>
      <dc:date>2012-04-30T13:59:10Z</dc:date>
    </item>
    <item>
      <title>Optimization kernel for HD4000</title>
      <link>https://community.intel.com/t5/OpenCL-for-CPU/Optimization-kernel-for-HD4000/m-p/767093#M94</link>
      <description>&lt;DIV id="tiny_quote"&gt;&lt;DIV style="margin-left: 2px; margin-right: 2px;"&gt;Quoting &lt;A jquery1336433081686="58" rel="/en-us/services/profile/quick_profile.php?is_paid=&amp;amp;user_id=557355" href="https://community.intel.com/en-us/profile/557355/" class="basic"&gt;christolb29&lt;/A&gt;&lt;/DIV&gt;&lt;DIV style="background-color: #e5e5e5; margin-left: 2px; margin-right: 2px; border: 1px inset; padding: 5px;"&gt;&lt;I&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;#######################################################################*/&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;// repeat reduction in local memory&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;for(int s = localSize&amp;gt;&amp;gt;1; s &amp;gt; 1; s &amp;gt;&amp;gt;= 1)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;{&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;//skip non-valide values from partially filled workgroups (last WG of each dimension&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;if(l_j*l_size_i+l_i&amp;lt; s)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;{&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;if(s &amp;lt;= localSize&amp;gt;&amp;gt;2)&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fladIntra[l_j*l_size_i+l_i] += localmem_fladIntra[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fladInter1[l_j*l_size_i+l_i] += localmem_fladInter1[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fladInter2[l_j*l_size_i+l_i] += localmem_fladInter2[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;localmem_fldc[l_j*l_size_i+l_i] += localmem_fldc[l_j*l_size_i+l_i+ s];&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;// keep barrier outside conditional&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;/* ###################################################################*/&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;barrier(CLK_LOCAL_MEM_FENCE);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;/* ####################################################################*/&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;#endif //SKIP_REDUCTION&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;// write result to global memory&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;if (l_i== 0 &amp;amp;&amp;amp; l_j==0) //&amp;amp;&amp;amp; (gid_i &amp;lt; (wg_i-1) || rest_x==0) &amp;amp;&amp;amp; (gid_j &amp;lt; (wg_j-1) || rest_y==0))&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;{&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Intra=(localmem_fladIntra[0] + localmem_fladIntra[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Inter1=(localmem_fladInter1[0] + localmem_fladInter1[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Inter2=(localmem_fladInter2[0] + localmem_fladInter2[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;tmp_Fldc=(localmem_fldc[0] + localmem_fldc[1]);&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fladIntra_sum[gid_j*wg_i + gid_i] =tmp_Intra.s0 + tmp_Intra.s1 + tmp_Intra.s2 + tmp_Intra.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fladInter1_sum[gid_j*wg_i + gid_i] =tmp_Inter1.s0 + tmp_Inter1.s1 + tmp_Inter1.s2 + tmp_Inter1.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fladInter2_sum[gid_j*wg_i + gid_i] =tmp_Inter2.s0 + tmp_Inter2.s1 + tmp_Inter2.s2 + tmp_Inter2.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;p_fldc_sum[gid_j*wg_i + gid_i] =tmp_Fldc.s0 + tmp_Fldc.s1 + tmp_Fldc.s2 + tmp_Fldc.s3;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;&lt;I&gt;}&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;B&gt;&lt;I&gt;&lt;BR /&gt;&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;&lt;DIV&gt;I use workgroup size of 128 x 2, which is the best after testing different sizes.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;The execution time is about 2.25ms for this kernel. I do not take into account the time for data transfert which is about 2ms.&lt;/DIV&gt;&lt;DIV&gt;The reduction uses 1.5ms of GPU time.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Also, as I am measuring it from a desktop computer which has no other graphic card, is there some king of configuration I should use during the measurements, no to disturb the GPU?&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Thank you.&lt;/DIV&gt;&lt;DIV&gt;Chris&lt;/DIV&gt;&lt;/I&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;P&gt;&lt;/P&gt;&lt;P class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;Please refer to the Optimize OpenCL* Usage (Intel Processor Graphics) section of the Optimization Guide. &lt;BR /&gt;Specifically the Notes on Loops (&lt;/SPAN&gt;&lt;A href="http://software.intel.com/sites/landingpage/opencl/optimization-guide/Note_on_Loops.htm"&gt;&lt;SPAN style="text-decoration: underline;"&gt;&lt;SPAN style="font-family: Calibri; color: #800080; font-size: small;"&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;A href="http://software.intel.com/sites/landingpage/opencl/optimization-guide/Note_on_Loops.htm" target="_blank"&gt;http://software.intel.com/sites/landingpage/opencl/optimization-guide/Note_on_Loops.htm&lt;/A&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;), Memory Access Consideration-Recommendations on Local Memory &lt;/SPAN&gt;&lt;A href="http://software.intel.com/sites/landingpage/opencl/optimization-guide/Memory_Access_Considerations.htm"&gt;&lt;SPAN style="text-decoration: underline;"&gt;&lt;SPAN style="font-family: Calibri; color: #800080; font-size: small;"&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;A href="http://software.intel.com/sites/landingpage/opencl/optimization-guide/Memory_Access_Considerations.htm" target="_blank"&gt;http://software.intel.com/sites/landingpage/opencl/optimization-guide/Memory_Access_Considerations.htm&lt;/A&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt; and Checklist for OpenCL Optimizations CPU and Processor Graphics  Using Floating point for calculations (&lt;/SPAN&gt;&lt;A href="http://software.intel.com/sites/landingpage/opencl/optimization-guide/Using_Floating_Point_for_Calculations.htm"&gt;&lt;SPAN style="text-decoration: underline;"&gt;&lt;SPAN style="font-family: Calibri; color: #800080; font-size: small;"&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;A href="http://software.intel.com/sites/landingpage/opencl/optimization-guide/Using_Floating_Point_for_Calculations.htm" target="_blank"&gt;http://software.intel.com/sites/landingpage/opencl/optimization-guide/Using_Floating_Point_for_Calculations.htm&lt;/A&gt;&lt;SPAN style="font-size: small;"&gt;&lt;SPAN style="font-family: Calibri;"&gt;)&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;P&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/P&gt;&lt;P class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;B&gt;&lt;SPAN style="font-size: small;"&gt;&lt;SPAN style="font-family: Calibri;"&gt;Tips to optimize the code are as follows:&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;&lt;P class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;P&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/P&gt;&lt;P class="MsoListParagraph" style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1;"&gt;&lt;SPAN style="mso-fareast-font-family: Calibri;"&gt;&lt;SPAN style="mso-list: Ignore;"&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;-&lt;/SPAN&gt;&lt;SPAN style="font: 7pt " times="" new="" roman=""&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: small;"&gt;&lt;SPAN style="font-family: Calibri;"&gt;Offload loop calculations &lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P class="MsoListParagraph" style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1;"&gt;&lt;SPAN style="mso-fareast-font-family: Calibri;"&gt;&lt;SPAN style="mso-list: Ignore;"&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;-&lt;/SPAN&gt;&lt;SPAN style="font: 7pt " times="" new="" roman=""&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: small;"&gt;&lt;SPAN style="font-family: Calibri;"&gt;Consider manual unroll &lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P class="MsoListParagraph" style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1;"&gt;&lt;SPAN style="mso-fareast-font-family: Calibri;"&gt;&lt;SPAN style="mso-list: Ignore;"&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;-&lt;/SPAN&gt;&lt;SPAN style="font: 7pt " times="" new="" roman=""&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: small;"&gt;&lt;SPAN style="font-family: Calibri;"&gt;Merge/ off load conditionals&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P class="MsoListParagraph" style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1;"&gt;&lt;SPAN style="mso-fareast-font-family: Calibri;"&gt;&lt;SPAN style="mso-list: Ignore;"&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;-&lt;/SPAN&gt;&lt;SPAN style="font: 7pt " times="" new="" roman=""&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: small;"&gt;&lt;SPAN style="font-family: Calibri;"&gt;Use cl-mad enable&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P class="MsoListParagraph" style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1;"&gt;&lt;SPAN style="mso-fareast-font-family: Calibri;"&gt;&lt;SPAN style="mso-list: Ignore;"&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;-&lt;/SPAN&gt;&lt;SPAN style="font: 7pt " times="" new="" roman=""&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="font-size: small;"&gt;&lt;SPAN style="font-family: Calibri;"&gt;Use float4 instead of int4&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P class="MsoListParagraph" style="text-indent: -0.25in; margin: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1;"&gt;&lt;SPAN style="mso-fareast-font-family: Calibri;"&gt;&lt;SPAN style="mso-list: Ignore;"&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;-&lt;/SPAN&gt;&lt;SPAN style="font: 7pt " times="" new="" roman=""&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;Ensure there are no bank conflicts  Please refer to Local Memory &lt;/SPAN&gt;&lt;A href="http://software.intel.com/sites/landingpage/opencl/optimization-guide/local_Memory.htm"&gt;&lt;SPAN style="text-decoration: underline;"&gt;&lt;SPAN style="font-family: Calibri; color: #800080; font-size: small;"&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;A href="http://software.intel.com/sites/landingpage/opencl/optimization-guide/local_Memory.htm" target="_blank"&gt;http://software.intel.com/sites/landingpage/opencl/optimization-guide/local_Memory.htm&lt;/A&gt;&lt;P&gt;&lt;/P&gt;&lt;/P&gt;&lt;P class="MsoListParagraph" style="margin: 0in 0in 0pt 0.5in;"&gt;&lt;P&gt;&lt;SPAN style="font-family: Calibri; font-size: small;"&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 07 May 2012 23:28:44 GMT</pubDate>
      <guid>https://community.intel.com/t5/OpenCL-for-CPU/Optimization-kernel-for-HD4000/m-p/767093#M94</guid>
      <dc:creator>Sarayu_C_Intel</dc:creator>
      <dc:date>2012-05-07T23:28:44Z</dc:date>
    </item>
  </channel>
</rss>

