<div dir="ltr">Hi,<div><br></div><div>I am working on parallelizing softpipe of Mesa-9.1 by using OpenMP.</div><div><br></div><div>My idea is trying to do sp_setup_tri in parallel with multiple threads.</div><div><br></div><div>So first in the function sp_vbuf_draw_elements, I duplicate setup_context for avoiding race condition</div><div><br></div><div>And then sp_setup_tri is set to OpenMP parallel sections with the separate auguments</div><div><br></div><div>The code is as follows:</div><div><br></div><div><div>sp_vbuf_draw_elements(struct vbuf_render *vbr, const ushort *indices, uint nr) </div><div>{</div><div>   struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr);</div><div>   struct softpipe_context *softpipe = cvbr->softpipe;</div><div>   const unsigned stride = softpipe->vertex_info_vbuf.size * sizeof(float);</div><div>   const void *vertex_buffer = cvbr->vertex_buffer;</div><div>   struct setup_context *setup = cvbr->setup;</div></div><div><br></div><div>/*duplicate setup context*/</div><div>struct setup_context *setup_0, *setup_1;</div><div>if(cvbr->prim == PIPE_PRIM_TRIANGLES)</div><div>{</div><div>    setup_0 = sp_setup_create_context(cvbr->setup);</div><div>    setup_1 = sp_setup_create_context(cvbr->setup);</div><div>}</div><div><br></div><div>...</div><div><br></div><div><div>   case PIPE_PRIM_TRIANGLES:</div><div>/*</div><div>      for (i = 2; i < nr; i += 3) {</div><div>         sp_setup_tri( setup,</div><div>                       get_vert(vertex_buffer, indices[i-2], stride),</div><div>                       get_vert(vertex_buffer, indices[i-1], stride),</div><div>                       get_vert(vertex_buffer, indices[i-0], stride) );</div><div>      }</div><div>*/</div><div><br></div><div>/*parallelizing sp_setup_tri by OpenMP parallel sections*/</div><div>if(nr==6)</div><div>{</div><div>    #pragma omp parallel sections</div><div>    {</div><div>        #pragma omp section</div><div>        sp_setup_tri(setup_0, get_vert(vertex_buffer, indices[0], stride), get_vert(vertex_buffer, indices[1], stride),get_vert(vertex_buffer, indices[2], stride));</div><div>        #pragma omp section</div><div>        sp_setup_tri(setup_1, get_vert(vertex_buffer, indices[3], stride), get_vert(vertex_buffer, indices[4], stride),get_vert(vertex_buffer, indices[5], stride));        </div><div>    }</div><div>}</div><div><div>    sp_setup_destroy_context(setup_0);</div><div>    sp_setup_destroy_context(setup_1);</div></div><div><br></div><div>      break;</div></div><div><br></div><div>And I rebuild mesa and run one test called CPUOverheadTest_onscreen from GFXBench 2.7.5</div><div><br></div><div>I set OMP_NUM_THREADS=2 and the resolution is 1280x900, it gains 10% performance improvements comparing to OMP_NUM_THREADS=1</div><div><br></div><div>However, the test result is not correct, but it works very well comparing to my first attempt on parallelization </div><div><br></div><div>Could someone give me a guide or suggestions for this work? </div><div><br></div><div>Thanks in advance!</div><div><br></div><div><br></div><div>Patrick Lin</div></div>