The term "flush set" is not defined. However, under the section on the flush construct it states:
A flush construct without a list, executed on a given thread, operates as if the whole threadvisible
data state of the program, as defined by the base language, is flushed.
So in theory, all variables visible to the thread are flushed. However, an implementation may be smart enough not to flush all variables. For example, flushing variables private to the thread makes no sense.
Compilers do not have to do flushes before all reads/writes according to the OpenMP spec. There are points where flushes are defined to happen by the spec, because it eases programming for the user. If it were done everywhere, then you would see a substantial performance penalty. That is the reason that the flush construct was added to the OpenMP spec - to allow the user to add them in the (hopefully) rare cases that need them. Most of the time, unless the user is trying to do synchronization between threads, flushes are not really required to get work done.