void emu_load(emu_t *emu, const char *filename) { ines_t *nes; nes = ines_load(filename); cpu_map(emu->cpu, 0x8000, nes->prg, ines_prg_size(nes) * 1024); ppu_map(emu->ppu, 0x0000, nes->chr, ines_chr_size(nes) * 1024); }
int main(int argc, char *argv[]) { // Paso por parametro del valor de M if(argc > 1){ M = atoi(argv[1]); //printf("Running with M = %d\n", M); } else{ //printf("Running with default M = 10000\n"); } // Los vectores en C++ son escencialmente arreglos en C con una interfaz // más conveniente. Donde sea que se pueda usar arreglos, se puede usar // vectores. Cuando se necesita la dirección de memoria de un arreglo, hay // que usar la dirección del primer elemento del vector: &x[0]. x por sí // solo no sirve ya que es un objeto que encapsula al verdadero arreglo. std::vector<float> x1; x1.reserve(N); x1.resize(N); // copiar datos del archivo de entrada al vector std::ifstream input_file(data_file_name, std::ios::binary | std::ios::in); if (!input_file) { std::cerr << "No se pudo abrir el archivo " << data_file_name << std::endl; std::exit(-1); } input_file.read((char *) &x1[0], N * sizeof(float)); input_file.close(); // crear una copia del vector, de modo de tener // uno para mapear en la GPU y otro en la CPU std::vector<float> x2(x1); // mapear x1 en la CPU y x2 en la GPU cpu_map(x1, M); gpu_map(&x2[0], x2.size(), M); // verificar que los resultados son prácticamente iguales float squared_diff_norm = 0.0; # define SQUARED(x) ((x) * (x)) # pragma omp parallel reduction(+: squared_diff_norm) for (unsigned i = 0; i < N; ++i) squared_diff_norm += SQUARED(x1[i] - x2[i]); // Comentar para tests //std::cout << "Norma de la diferencia: " << std::sqrt(squared_diff_norm) << std::endl; // Descomentar para tests std::cout << std::sqrt(squared_diff_norm) << std::endl; }