Судя по тому, как вы организовали это для цикла:
for(index=id;(index*3)<limita;index+=omp_get_num_threads())
{
buff[de_scris][index*3]=worker_buffer[0][index/dimensiuni_forme[9]][index%dimensiuni_forme[9]]; //aici va veni send_buff[index].x
buff[de_scris][index*3+1]=buff[de_scris][index*3]+0.5;
buff[de_scris][index*3+2]=buff[de_scris][index*3]+0.75;
}
и при условии, что у вас 4 потока, ваши потоки получат чередующиеся значения индекса:
thread 0: 0, 4, 8, 12,...
thread 1: 1, 5, 9, 13,...
thread 2: 2, 6, 10, 14,...
thread 3: 3, 7, 11, 15,...
, что может вызывать эффекты кеш-пинг-понга, поскольку значения, записанные разными потоками, могут попадать в одну и ту же строку кэша, что замедляет выполнение.
Попробуйте вместо этого использовать простой цикл for со статическим разбиением, чтобы получить непрерывные разбиения:
#pragma omp parallel for
for(index = 0; index < limita / 3;index++)
{
buff[de_scris][index*3]=worker_buffer[0][index/dimensiuni_forme[9]][index%dimensiuni_forme[9]]; //aici va veni send_buff[index].x
buff[de_scris][index*3+1]=buff[de_scris][index*3]+0.5;
buff[de_scris][index*3+2]=buff[de_scris][index*3]+0.75;
}