1. A method implemented by a compiler, comprising: performing a first analysis of a program to be executed by a multiprocessor system, wherein the first analysis includes a lexical and syntax analysis, the multiprocessor system includes a plurality of processing elements and a first memory accessible by each processing element, and each processing element includes a processor and a second memory including a cache memory; dividing the program into tasks, based on the first analysis, wherein each of the tasks is to be assigned to corresponding one of the processing elements; performing a second analysis, wherein the second analysis includes an analysis of data dependency among the tasks and an analysis of a range of data to be used in performing a corresponding task among the tasks; determining, based on the second analysis, whether a boundary of the data to be used in performing the corresponding task is consistent with a boundary of a line, wherein the line is defined as a data management unit of the first memory and the second memory, and data transfer is performed between the first memory and the second memory for each line; when a boundary of data that is not consistent with the boundary of the line is determined, generating a first code instructing to provide a non-cacheable area in the first memory, wherein data stored in the non-cacheable area is a part of the data to be used in performing the corresponding task, and is not transferred to the second memory; generating a second code instructing to store, in the non-cacheable area, a result of arithmetic processing using the data stored in the non-cacheable area; and generating a parallel program which includes the generated first code and the generated second code and is executable by the multiprocessor system.