<?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 OpenMP performance Core2 Quad Q6600 versus Xeon E7330? in Intel® Moderncode for Parallel Architectures</title>
    <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/OpenMP-performance-Core2-Quad-Q6600-versus-Xeon-E7330/m-p/855291#M2057</link>
    <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;I was wondering if someone could help me out with why I am seeingperformance issues between with my openMP application. My application is a LDPC decoder, it's very simple in that each thread runs a copy of the decoder on a block of data. &lt;/P&gt;
&lt;P&gt;Up until now, I have been writing my code for the Q6600. Now, my first assumption is that the Intel Xeon E7330 is as fast as the Core2Quad Q6600. And I am seeing that when running my code in a single thread.&lt;/P&gt;
&lt;P&gt; With OpenMP, I definitely see a ~4x improvement withmultithreading on the Q6600 machine. However,on the Xeon,the performance isonly around2x better. The Xeon machine has 4 processors(16cores total). &lt;/P&gt;
&lt;P&gt;I'm using the intel C++ compiler with flags -fast -openmp under redhat linux.&lt;/P&gt;
&lt;P&gt;I could be doing something really dumb. Here's my code:&lt;/P&gt;
&lt;P&gt;---------------------------------------------------------------------&lt;/P&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;IOSTREAM&gt;&lt;/IOSTREAM&gt;&lt;/FONT&gt;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" size="2"&gt;#include&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;FSTREAM&gt;&lt;/FSTREAM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;STRING&gt;&lt;P&gt;&lt;/P&gt;&lt;/STRING&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;TIME.H&gt;&lt;P&gt;&lt;/P&gt;&lt;/TIME.H&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;CSTDIO&gt;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/CSTDIO&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;OMP.H&gt;&lt;P&gt;&lt;/P&gt;&lt;/OMP.H&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;using&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;namespace&lt;/FONT&gt;&lt;FONT size="2"&gt; std;&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"ldpc.h"&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"ldpc_dec.h"&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;int&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; main(&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; argc, &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; *argv[])&lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; i, j, k, ii;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; rate;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; frames;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; yOutputSize = 0;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;clock_t timer;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; n_thds = 0;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; N = OUTPUT_SIZE;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;FILE *fpInputData, *fpOutputData;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;clx_ldpc_dec * ldpc_decoder1;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#ifdef&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; MULTI_THREADED&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; xInput[OUTPUT_SIZE*NUMBER_OF_BUFFERS*4];&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; * xInput2;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; * xInput3;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; * xInput4;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;clx_ldpc_dec * ldpc_decoder2;&lt;/P&gt;
&lt;P&gt;clx_ldpc_dec * ldpc_decoder3;&lt;/P&gt;
&lt;P&gt;clx_ldpc_dec * ldpc_decoder4;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#else&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; xInput[OUTPUT_SIZE*NUMBER_OF_BUFFERS];&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#endif&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;rate = atoi(argv[3]);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ldpc_decoder1 = &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;new&lt;/FONT&gt;&lt;FONT size="2"&gt; clx_ldpc_dec(rate);&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#ifdef&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; MULTI_THREADED&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ldpc_decoder2 = &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;new&lt;/FONT&gt;&lt;FONT size="2"&gt; clx_ldpc_dec(rate);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ldpc_decoder3 = &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;new&lt;/FONT&gt;&lt;FONT size="2"&gt; clx_ldpc_dec(rate);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ldpc_decoder4 = &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;new&lt;/FONT&gt;&lt;FONT size="2"&gt; clx_ldpc_dec(rate);&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#endif&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;fpInputData = fopen(argv[1], &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"rb"&lt;/FONT&gt;&lt;FONT size="2"&gt;); &lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;if&lt;/FONT&gt;&lt;FONT size="2"&gt;(fpInputData == NULL){&lt;P&gt;&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"Failed to open input file %s
"&lt;/FONT&gt;&lt;FONT size="2"&gt;,argv[1]);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;return&lt;/FONT&gt;&lt;FONT size="2"&gt; -1;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;fpOutputData = fopen(argv[2], &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"wb"&lt;/FONT&gt;&lt;FONT size="2"&gt;);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;if&lt;/FONT&gt;&lt;FONT size="2"&gt;(fpOutputData == NULL){&lt;P&gt;&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"Failed to open output file %s
"&lt;/FONT&gt;&lt;FONT size="2"&gt;,argv[2]);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;return&lt;/FONT&gt;&lt;FONT size="2"&gt; -1;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;n_thds = omp_get_max_threads();&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"Max Number of Threads = %d
"&lt;/FONT&gt;&lt;FONT size="2"&gt;, n_thds);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;if&lt;/FONT&gt;&lt;FONT size="2"&gt;(n_thds &amp;gt; 4)&lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"Setting Max Number of Threads to 4
"&lt;/FONT&gt;&lt;FONT size="2"&gt;);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;omp_set_num_threads(4);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;timer = clock();&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#ifdef&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; MULTI_THREADED&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;for&lt;/FONT&gt;&lt;FONT size="2"&gt;(k = 0; k &amp;lt; (NUMBDER_OF_BLOCKS/4)/NUMBER_OF_BUFFERS; k++){ &lt;P&gt;&lt;/P&gt;
&lt;P&gt;fread(xInput, &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;sizeof&lt;/FONT&gt;&lt;FONT size="2"&gt;(&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt;), BYTES_TO_READ*NUMBER_OF_BUFFERS*4, fpInputData);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;xInput2 = xInput+BYTES_TO_READ*NUMBER_OF_BUFFERS;&lt;/P&gt;
&lt;P&gt;xInput3 = xInput+BYTES_TO_READ*NUMBER_OF_BUFFERS*2;&lt;/P&gt;
&lt;P&gt;xInput4 = xInput+BYTES_TO_READ*NUMBER_OF_BUFFERS*3;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;#pragma&lt;/FONT&gt;&lt;FONT size="2"&gt; omp parallel sections &lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;#pragma&lt;/FONT&gt;&lt;FONT size="2"&gt; omp &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;section&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;ldpc_decoder1-&amp;gt;decode(xInput);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;#pragma&lt;/FONT&gt;&lt;FONT size="2"&gt; omp &lt;/FONT&gt;&lt;FO nt="" color="#0000ff" size="2"&gt;section&lt;FONT size="2"&gt; &lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;ldpc_decoder2-&amp;gt;decode(xInput2);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;#pragma&lt;/FONT&gt;&lt;FONT size="2"&gt; omp &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;section&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;ldpc_decoder3-&amp;gt;decode(xInput3);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;#pragma&lt;/FONT&gt;&lt;FONT size="2"&gt; omp &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;section&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;ldpc_decoder4-&amp;gt;decode(xInput4);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;} &lt;/P&gt;
&lt;P&gt;fwrite(xInput, &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;sizeof&lt;/FONT&gt;&lt;FONT size="2"&gt;(&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt;), BYTES_TO_READ*NUMBER_OF_BUFFERS*4, fpOutputData); &lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#else&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;for&lt;/FONT&gt;&lt;FONT size="2"&gt;(k = 0; k &amp;lt; NUMBDER_OF_BLOCKS/NUMBER_OF_BUFFERS; k++){ &lt;P&gt;&lt;/P&gt;
&lt;P&gt;fread(xInput, &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;sizeof&lt;/FONT&gt;&lt;FONT size="2"&gt;(&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt;), BYTES_TO_READ*NUMBER_OF_BUFFERS, fpInputData);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ldpc_decoder1-&amp;gt;decode(xInput);&lt;/P&gt;
&lt;P&gt;fwrite(xInput, &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;sizeof&lt;/FONT&gt;&lt;FONT size="2"&gt;(&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt;), BYTES_TO_READ*NUMBER_OF_BUFFERS, fpOutputData); &lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#endif&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;timer = clock()-timer;&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;" Time: %f
"&lt;/FONT&gt;&lt;FONT size="2"&gt; , ((&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;double&lt;/FONT&gt;&lt;FONT size="2"&gt;)(timer) / (&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;double&lt;/FONT&gt;&lt;FONT size="2"&gt;)CLOCKS_PER_SEC));&lt;P&gt;&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"%f mb/s
"&lt;/FONT&gt;&lt;FONT size="2"&gt;,((&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;double&lt;/FONT&gt;&lt;FONT size="2"&gt;)(OUTPUT_SIZE*NUMBER_OF_BUFFERS) / ((&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;double&lt;/FONT&gt;&lt;FONT size="2"&gt;)(timer) / (&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;double&lt;/FONT&gt;&lt;FONT size="2"&gt;)CLOCKS_PER_SEC) * 1e-6 ));&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;fclose(fpInputData); &lt;/P&gt;
&lt;P&gt;fclose(fpOutputData);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;return&lt;/FONT&gt;&lt;FONT size="2"&gt; 0;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;Thanks,&lt;/P&gt;
&lt;P&gt;James&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FO&gt;</description>
    <pubDate>Tue, 05 Feb 2008 17:54:24 GMT</pubDate>
    <dc:creator>jpgolab</dc:creator>
    <dc:date>2008-02-05T17:54:24Z</dc:date>
    <item>
      <title>OpenMP performance Core2 Quad Q6600 versus Xeon E7330?</title>
      <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/OpenMP-performance-Core2-Quad-Q6600-versus-Xeon-E7330/m-p/855291#M2057</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;I was wondering if someone could help me out with why I am seeingperformance issues between with my openMP application. My application is a LDPC decoder, it's very simple in that each thread runs a copy of the decoder on a block of data. &lt;/P&gt;
&lt;P&gt;Up until now, I have been writing my code for the Q6600. Now, my first assumption is that the Intel Xeon E7330 is as fast as the Core2Quad Q6600. And I am seeing that when running my code in a single thread.&lt;/P&gt;
&lt;P&gt; With OpenMP, I definitely see a ~4x improvement withmultithreading on the Q6600 machine. However,on the Xeon,the performance isonly around2x better. The Xeon machine has 4 processors(16cores total). &lt;/P&gt;
&lt;P&gt;I'm using the intel C++ compiler with flags -fast -openmp under redhat linux.&lt;/P&gt;
&lt;P&gt;I could be doing something really dumb. Here's my code:&lt;/P&gt;
&lt;P&gt;---------------------------------------------------------------------&lt;/P&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;IOSTREAM&gt;&lt;/IOSTREAM&gt;&lt;/FONT&gt;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" size="2"&gt;#include&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;FSTREAM&gt;&lt;/FSTREAM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;STRING&gt;&lt;P&gt;&lt;/P&gt;&lt;/STRING&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;TIME.H&gt;&lt;P&gt;&lt;/P&gt;&lt;/TIME.H&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;CSTDIO&gt;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/CSTDIO&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;&lt;OMP.H&gt;&lt;P&gt;&lt;/P&gt;&lt;/OMP.H&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;using&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;namespace&lt;/FONT&gt;&lt;FONT size="2"&gt; std;&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"ldpc.h"&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#include&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"ldpc_dec.h"&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;int&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; main(&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; argc, &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; *argv[])&lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; i, j, k, ii;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; rate;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; frames;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; yOutputSize = 0;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;clock_t timer;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; n_thds = 0;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;int&lt;/FONT&gt;&lt;FONT size="2"&gt; N = OUTPUT_SIZE;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;FILE *fpInputData, *fpOutputData;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;clx_ldpc_dec * ldpc_decoder1;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#ifdef&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; MULTI_THREADED&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; xInput[OUTPUT_SIZE*NUMBER_OF_BUFFERS*4];&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; * xInput2;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; * xInput3;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; * xInput4;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;clx_ldpc_dec * ldpc_decoder2;&lt;/P&gt;
&lt;P&gt;clx_ldpc_dec * ldpc_decoder3;&lt;/P&gt;
&lt;P&gt;clx_ldpc_dec * ldpc_decoder4;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#else&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt; xInput[OUTPUT_SIZE*NUMBER_OF_BUFFERS];&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#endif&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;rate = atoi(argv[3]);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ldpc_decoder1 = &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;new&lt;/FONT&gt;&lt;FONT size="2"&gt; clx_ldpc_dec(rate);&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#ifdef&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; MULTI_THREADED&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ldpc_decoder2 = &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;new&lt;/FONT&gt;&lt;FONT size="2"&gt; clx_ldpc_dec(rate);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ldpc_decoder3 = &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;new&lt;/FONT&gt;&lt;FONT size="2"&gt; clx_ldpc_dec(rate);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ldpc_decoder4 = &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;new&lt;/FONT&gt;&lt;FONT size="2"&gt; clx_ldpc_dec(rate);&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#endif&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;fpInputData = fopen(argv[1], &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"rb"&lt;/FONT&gt;&lt;FONT size="2"&gt;); &lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;if&lt;/FONT&gt;&lt;FONT size="2"&gt;(fpInputData == NULL){&lt;P&gt;&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"Failed to open input file %s
"&lt;/FONT&gt;&lt;FONT size="2"&gt;,argv[1]);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;return&lt;/FONT&gt;&lt;FONT size="2"&gt; -1;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;fpOutputData = fopen(argv[2], &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"wb"&lt;/FONT&gt;&lt;FONT size="2"&gt;);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;if&lt;/FONT&gt;&lt;FONT size="2"&gt;(fpOutputData == NULL){&lt;P&gt;&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"Failed to open output file %s
"&lt;/FONT&gt;&lt;FONT size="2"&gt;,argv[2]);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;return&lt;/FONT&gt;&lt;FONT size="2"&gt; -1;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;n_thds = omp_get_max_threads();&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"Max Number of Threads = %d
"&lt;/FONT&gt;&lt;FONT size="2"&gt;, n_thds);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;if&lt;/FONT&gt;&lt;FONT size="2"&gt;(n_thds &amp;gt; 4)&lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"Setting Max Number of Threads to 4
"&lt;/FONT&gt;&lt;FONT size="2"&gt;);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;omp_set_num_threads(4);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;timer = clock();&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#ifdef&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt; MULTI_THREADED&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;for&lt;/FONT&gt;&lt;FONT size="2"&gt;(k = 0; k &amp;lt; (NUMBDER_OF_BLOCKS/4)/NUMBER_OF_BUFFERS; k++){ &lt;P&gt;&lt;/P&gt;
&lt;P&gt;fread(xInput, &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;sizeof&lt;/FONT&gt;&lt;FONT size="2"&gt;(&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt;), BYTES_TO_READ*NUMBER_OF_BUFFERS*4, fpInputData);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;xInput2 = xInput+BYTES_TO_READ*NUMBER_OF_BUFFERS;&lt;/P&gt;
&lt;P&gt;xInput3 = xInput+BYTES_TO_READ*NUMBER_OF_BUFFERS*2;&lt;/P&gt;
&lt;P&gt;xInput4 = xInput+BYTES_TO_READ*NUMBER_OF_BUFFERS*3;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;#pragma&lt;/FONT&gt;&lt;FONT size="2"&gt; omp parallel sections &lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;#pragma&lt;/FONT&gt;&lt;FONT size="2"&gt; omp &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;section&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;ldpc_decoder1-&amp;gt;decode(xInput);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;#pragma&lt;/FONT&gt;&lt;FONT size="2"&gt; omp &lt;/FONT&gt;&lt;FO nt="" color="#0000ff" size="2"&gt;section&lt;FONT size="2"&gt; &lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;ldpc_decoder2-&amp;gt;decode(xInput2);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;#pragma&lt;/FONT&gt;&lt;FONT size="2"&gt; omp &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;section&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;ldpc_decoder3-&amp;gt;decode(xInput3);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;#pragma&lt;/FONT&gt;&lt;FONT size="2"&gt; omp &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;section&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;P&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;ldpc_decoder4-&amp;gt;decode(xInput4);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;} &lt;/P&gt;
&lt;P&gt;fwrite(xInput, &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;sizeof&lt;/FONT&gt;&lt;FONT size="2"&gt;(&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt;), BYTES_TO_READ*NUMBER_OF_BUFFERS*4, fpOutputData); &lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#else&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;for&lt;/FONT&gt;&lt;FONT size="2"&gt;(k = 0; k &amp;lt; NUMBDER_OF_BLOCKS/NUMBER_OF_BUFFERS; k++){ &lt;P&gt;&lt;/P&gt;
&lt;P&gt;fread(xInput, &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;sizeof&lt;/FONT&gt;&lt;FONT size="2"&gt;(&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt;), BYTES_TO_READ*NUMBER_OF_BUFFERS, fpInputData);&lt;P&gt;&lt;/P&gt;
&lt;P&gt;ldpc_decoder1-&amp;gt;decode(xInput);&lt;/P&gt;
&lt;P&gt;fwrite(xInput, &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;sizeof&lt;/FONT&gt;&lt;FONT size="2"&gt;(&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;unsigned&lt;/FONT&gt;&lt;FONT size="2"&gt; &lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;char&lt;/FONT&gt;&lt;FONT size="2"&gt;), BYTES_TO_READ*NUMBER_OF_BUFFERS, fpOutputData); &lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;
&lt;P&gt;#endif&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size="2"&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;timer = clock()-timer;&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;" Time: %f
"&lt;/FONT&gt;&lt;FONT size="2"&gt; , ((&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;double&lt;/FONT&gt;&lt;FONT size="2"&gt;)(timer) / (&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;double&lt;/FONT&gt;&lt;FONT size="2"&gt;)CLOCKS_PER_SEC));&lt;P&gt;&lt;/P&gt;
&lt;P&gt;printf(&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#800000" size="2"&gt;"%f mb/s
"&lt;/FONT&gt;&lt;FONT size="2"&gt;,((&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;double&lt;/FONT&gt;&lt;FONT size="2"&gt;)(OUTPUT_SIZE*NUMBER_OF_BUFFERS) / ((&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;double&lt;/FONT&gt;&lt;FONT size="2"&gt;)(timer) / (&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;double&lt;/FONT&gt;&lt;FONT size="2"&gt;)CLOCKS_PER_SEC) * 1e-6 ));&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;fclose(fpInputData); &lt;/P&gt;
&lt;P&gt;fclose(fpOutputData);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color="#0000ff" size="2"&gt;return&lt;/FONT&gt;&lt;FONT size="2"&gt; 0;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;Thanks,&lt;/P&gt;
&lt;P&gt;James&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/FO&gt;</description>
      <pubDate>Tue, 05 Feb 2008 17:54:24 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/OpenMP-performance-Core2-Quad-Q6600-versus-Xeon-E7330/m-p/855291#M2057</guid>
      <dc:creator>jpgolab</dc:creator>
      <dc:date>2008-02-05T17:54:24Z</dc:date>
    </item>
    <item>
      <title>Re: OpenMP performance Core2 Quad Q6600 versus Xeon E7330?</title>
      <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/OpenMP-performance-Core2-Quad-Q6600-versus-Xeon-E7330/m-p/855292#M2058</link>
      <description>I think we're mystified about what you're getting at. It seems logical that you would affinitize your threads to a single CPU, although you haven't mentioned it. If KMP_AFFINITY=compact doesn't work, specifying 4 cores on a single socket, by number, might. In the latter case, you would need to open a separate environment for each job, if your intent is to run more than one of these 4 thread jobs at a time. Still, a job which runs well on a single socket doesn't appear to be one for which a 4 socket machine could be recommended.&lt;BR /&gt;</description>
      <pubDate>Wed, 06 Feb 2008 14:01:17 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/OpenMP-performance-Core2-Quad-Q6600-versus-Xeon-E7330/m-p/855292#M2058</guid>
      <dc:creator>TimP</dc:creator>
      <dc:date>2008-02-06T14:01:17Z</dc:date>
    </item>
    <item>
      <title>Re: OpenMP performance Core2 Quad Q6600 versus Xeon E7330?</title>
      <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/OpenMP-performance-Core2-Quad-Q6600-versus-Xeon-E7330/m-p/855293#M2059</link>
      <description>&lt;P&gt;The1 x Q6600 is one socket, each socket 4 cores but internally it is 2 processors, each of 2 cores and each processor with own cache. As such Q6600 has 2 separate cache systems.&lt;/P&gt;
&lt;P&gt;The 4 x E7330 is four sockets, each socket 4 cores (x4=16 cores)but internally each E7330 has 2 processors (x4=8 processors), each of 2 cores (x8=16 cores) and as such there are8 seperate cache systems.&lt;/P&gt;
&lt;P&gt;The test run on the Q6600 may have tended to keep the 4 threads more or less within the core in which it was started. Thus the cache would tend to contain reusable data.&lt;/P&gt;
&lt;P&gt;The test run on the 4xE7330 may have tended to move the threads about the cores and thus the test may tend to experience loss of cached data.&lt;/P&gt;
&lt;P&gt;To make the test fair set the affinities to force the test application to run within one socket. Note, the "processor" numbering scheme depends on how the how the BIOS and OS perform initialization. You may have to do some experimentation (or run a diagnostic) to determine the (Affinity)processor number mapping for the E7330. Once determined then set the affinity bit map for the application to run within the 4 cores of one socket.&lt;/P&gt;
&lt;P&gt;The above settings permit the threads to float amongst cores but only within one socket. This would approximat the test environment of the Q6600.&lt;/P&gt;
&lt;P&gt;A seperate test would be to lock each thread to a specific processor within one socket. Do this for both Q6600 and E7330.&lt;/P&gt;
&lt;P&gt;A third test would be for the E7330 to lock each thread to a processor within a different socket.&lt;/P&gt;
&lt;P&gt;A forth test would be for the E7330 to lock each thread in sequencetoeach processor within a same socket, then next socket.&lt;/P&gt;
&lt;P&gt;E7330 socket to thread associations:&lt;/P&gt;&lt;PRE&gt;Test 1&lt;BR /&gt;|-F-||-F-| |---||---|&lt;BR /&gt;|-F-||-F-| |---||---|&lt;/PRE&gt;&lt;PRE&gt;|---||---| |---||---|&lt;BR /&gt;|---||---| |---||---|&lt;/PRE&gt;&lt;PRE&gt;Test 2&lt;BR /&gt;|-L-||-L-| |---||---|&lt;BR /&gt;|-L-||-L-| |---||---|&lt;/PRE&gt;&lt;PRE&gt;|---||---| |---||---|&lt;BR /&gt;|---||---| |---||---|&lt;/PRE&gt;&lt;PRE&gt;Test 3&lt;BR /&gt;|-L-||---| |-L-||---|&lt;BR /&gt;|---||---| |---||---|&lt;/PRE&gt;&lt;PRE&gt;|-L-||---| |-L-||---|&lt;BR /&gt;|---||---| |---||---|&lt;/PRE&gt;&lt;PRE&gt;Test 4&lt;BR /&gt;|-L-||-L-| |-L-||-L-|&lt;BR /&gt;|---||---| |---||---|&lt;/PRE&gt;&lt;PRE&gt;|---||---| |---||---|&lt;BR /&gt;|---||---| |---||---|&lt;/PRE&gt;&lt;PRE&gt;Where:&lt;BR /&gt;F=Float within selected processors&lt;BR /&gt;L=Locked to specific processor&lt;/PRE&gt;&lt;PRE&gt;Socket:&lt;BR /&gt;|---||---|&lt;BR /&gt;|---||---|&lt;BR /&gt;Processor witin socket: (2 cores sharing same cache)&lt;BR /&gt;|---|&lt;BR /&gt;|---|&lt;BR /&gt;Core witin processor within socket&lt;BR /&gt;|---|&lt;BR /&gt;&lt;/PRE&gt;&lt;PRE&gt;Jim Dempsey&lt;/PRE&gt;&lt;PRE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 06 Feb 2008 19:09:29 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/OpenMP-performance-Core2-Quad-Q6600-versus-Xeon-E7330/m-p/855293#M2059</guid>
      <dc:creator>jimdempseyatthecove</dc:creator>
      <dc:date>2008-02-06T19:09:29Z</dc:date>
    </item>
    <item>
      <title>Re: OpenMP performance Core2 Quad Q6600 versus Xeon E7330?</title>
      <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/OpenMP-performance-Core2-Quad-Q6600-versus-Xeon-E7330/m-p/855294#M2060</link>
      <description>&lt;P&gt;Oh, no! Desktop versus Server wars! Guess I haven't been checking this forum as often as I might.&lt;/P&gt;
&lt;P&gt;I think you've already demonstrated that the E7330 cores run as fast as the Q6600 core in your single threaded test. And looking over the code sample you provided, nothing jumps out at me, but there's one thing that the code doesn't answer: how big are these blocks of data being fed to the decoder instantiations? The only difference in the specs I saw is that the Q6600 has a full 8 MB L2 cache while the E7330 only has a 6 MB L2. If we were just talking one processor versus the other, big enough buffers could result in cache thrashing on the server part with four cores that you might not see on the Q6600. The affinity tests Jim suggested should explore that configuration more thoroughly.&lt;/P&gt;
&lt;P&gt;Beyond the processor, there are several other factors that come into play. The quad-socket E7330 uses FBDIMM memory versus DDR2 on the Q6600. The E7330 has 16 cores contending for memory on two busses versus only 4 cores on the Q6600. The code limits processing to 4 threads, but those four threads could land on any one of those 16 cores, as Jim suggested. And the way the code sample works, data for all four cores is read into memory by a single thread. If the buffer is small enough, it may still all reside in a single L2 cache where two cores have immediate access and the other two pay a small penalty, using Intel&lt;FONT size="4"&gt;&lt;FONT size="3"&gt; Advanced&lt;/FONT&gt;&lt;/FONT&gt;Smart Cache to get to the other L2. Whereas on the E7330, worst case scenario, the 4 threads land on four separate sockets and three will have to wait for the data to be read from memory. &lt;/P&gt;</description>
      <pubDate>Tue, 26 Feb 2008 03:19:54 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/OpenMP-performance-Core2-Quad-Q6600-versus-Xeon-E7330/m-p/855294#M2060</guid>
      <dc:creator>robert-reed</dc:creator>
      <dc:date>2008-02-26T03:19:54Z</dc:date>
    </item>
  </channel>
</rss>

