TEST BORRADO, QUIZÁS LE INTERESE: 1234123
COMENTARIOS | ESTADÍSTICAS | RÉCORDS |
---|
REALIZAR TEST
Título del Test:
1234123 Descripción: Cine gordo Autor: Alberto OTROS TESTS DEL AUTOR Fecha de Creación: 06/11/2023 Categoría: Cine y TV Número Preguntas: 134 |
COMPARTE EL TEST
Comentar
No hay ningún comentario sobre este test.
Temario:
¿Cómo agrega el directorio /opt/bin/a la variable de entorno PATH y se asegura de que se busque en último lugar? export PATH=/opt/bin/ export PATH=/opt/bin/:$PATH export PATH=$PATH:/opt/bin/. Suponga que la variable de entorno PATH tiene el siguiente contenido /usr/bin:/usr/local/bin. Hay un programa en cada directorio, es decir, /usr/bin/program y /usr/local/bin/program. ¿Cuál se ejecutará si se ejecuta programen el shell? El shell le preguntará cuál ejecutar. /usr/local/bin/program /usr/bin/program. ¿Cómo puedo enumerar todos los comandos disponibles si no sé el nombre exacto del comando, por ejemplo? presione la tecla enter presione la tecla de tabulación usa la opción --help leer las paginas man. ¿Qué tiene que agregar al encabezado de un script para convertirlo en un script bash ejecutable ? /bin/bash #!/bin/bash #BASH. ¿Cual de estos elementos no aparece en el prompt de consola? nombre de usuario hora y fecha nombre de host directorio de trabajo. ¿Qué comando se puede utilizar para añadir texto un archivo? comando >>> fichero comando > fichero comando >> fichero. ¿Qué sucede si las teclas de control y c (Ctrl + C) se presionan simultáneamente en la línea de comando? un script comienza a ejecutarse en el shell el comando actual se cancela el texto resaltado se copia al portapapeles. ¿Cómo es posible definir alias? alias 'command'=name alias name='command' 'command'=alias name. ¿Cuál es la convención de nomenclatura para las variables de entorno? No existe una convención de nomenclatura, es decir, VarTest2 Utilice letras minúsculas, es decir, vartest2 Utilice letras mayúsculas, es decir, VARTEST2. ¿Qué hace ln -s /tmp ? Crea un enlace simbólico del directorio actual en /tmp Imprime una lista de archivos ubicados en /tmp y Crea un enlace simbólico de /tmp en el directorio actual llamado ./tmp. La funcion Retorna el valor de x[j]. Retorna el valor de x[i]. Retorna el valor del mayor elemento del array x Retorna la posición del mayor elemento del array x. Suponiendo que el programa ejecutable que se obtiene al compilar programa se llama PROG. al dar la orden PROG 5 examen imprime c=1 al dar la orden PROG examen 5 imprime c=5 al dar la orden PROG examen 5 imprime c=0 al dar la orden PROG examen 5 imprime c=2 . AUAN 20 SARA 20 AARA 21 AUAN 19. Indicar que sentencias hay que sustituir por el comentario en el para que se impriman todos los datos del array a. printf("Nombre: %s, Nota: %.2f\n", a[i].nombre, a[i].nota); Ninguna de las anteriores printf("Nombre: %s, Nota: %.2f\n", a[i]->nombre, a[i]->nota); printf("Nombre: %s, Nota: %.2f\n", *a[i]->nombre, *a[i]->nota);. Indicar qué sentencias hay que sustituir por el comentario para que, al ejecutar el programa imprima el valor de x. printf ("%d",*p); printf ("%d",&p); printf ("%d",&x); printf ("%d",(int *)p);. Queremos que al compilar el programa prog.cse obtenga un fichero ejecutable prog.exe con posibilidad de argumentos en la línea de órdenes, de modo que al ejecutar la orden $ ./prog.exe 1 1 el programa imprima iguales. Indicar qué sentencia NO HARÍA lo que el enunciado indica cuando se sustituye por el comentario en el programa prog.c if (argv[1]==argv[2]) printf(“iguales"); if ( !strcmp(argv[1], argv[2] ) ) printf (“iguales”); if (*argv[1]==*argv[2]) printf (“iguales”); if (argv[1][0]==argv[2][0]) printf (“iguales”);. Con la siguiente declaración, ¿cómo podemos saber el número de elementos del array? int array[15]={0}; sizeof(array); sizeof(array)/sizeof(int); strlen(array); sizeof(array)*sizeof(int); . Indicar qué sentencias hay que sustituir por el comentario para que, al ejecutar el siguiente programa, se tome por teclado el valor de x. Ninguna de las anteriores scanf ("%f",&x); scanf ("%d",&p); scanf ("%d",&x );. Encuentra el error, si lo hay, en el código No hay ningún error &numero, en el scanf() int * numero; en la declaración de tipo de la variable numero. *numero, en el scanf(). Dadas estas declaraciones: int a[5]={10,20,30,40,50}; int *p, i; *p=a, i=2; ¿Cuáles de las opciones siguientes es correcta? La orden printf(" %d", *(p+i+1)); imprime 22 La orden printf(" %d", *(a+1)); imprime 10 La orden printf("%d",*p[i]); imprime 30 La orden printf("%d",*(p+i)); imprime 30. Según la ley de Amdahls, si un algoritmo tiene el 50% del código secuencial, el máximo speed-up que se puede alcanzar es 10 2 10%. Se dice que un problema es embarazosamente (ideal) paralelo cuando Se puede descomponer en tareas independientes que no necesitan coordinarse. cuando no es escalable Cuando alcanza el speed-up lineal. La lista top500 Ninguna de las otras opciones Lista los computadores actuales que son más eficientes energeticamente. Muestra los supercomputadores actuales que ofrecen mayor número de operaciones en coma flotante por segundo. Una granularidad computacional es fina cuando Ninguna de las otras opciones es correcta. Se realiza poco trabajo computacional entre eventos de comunicacion Se realiza mucho trabajo computacional entre eventos de comunicación. Al realizar un algoritmo paralelo que necesita comunicaciones, se prefiere que las comunicaciones sean sincronas siempre que sean posibles las comunicaciones sean asincronas siempre que sean posibles las comunicaciones afectan poco a la eficiencia de los algoritmos paralelos, lo importante es la computación que realizan. En una distribución de datos 2D del tipo "BLOCK,*" A cada tarea le corresponde un número de columnas consecutivas A cada tarea le puede tocar elementos no contiguos del array 2D. A cada tarea le tocan un número de filas consecutivas. Según la ley de Amhdals el máximo speed-up que se puede alcanzar, si el 10% del código del algoritmo es secuencial es: 2 50% 10. ¿cual no es un tipo de sincronización? Semaforo/cerrojo Uso de variables independientes en cada hebra/proceso Barrera. Cuando se realiza comunicaciones de datos es mejor tener alta latencia y gran ancho de banda alta latencia y bajo ancho de banda baja latencia y gran ancho de banda. Cuando un proceso/tarea accede a un dato, es mejor que esté en L2 que en L1 es mejor que esté en L1 que en L2 es mejor que esté en L3 que en L1. Cuando vamos a trabajar con números enteros, por defecto utilizamos: el tipo float. el tipo int. el tipo double. ¿Cómo se imprimiría por pantalla la siguiente constante #define MYNUM 8? printf (“Número %c”, MYNUM); printf (“Número %d”, MYNUM); printf (“Número ”, int(MYNUM));. ¿En cuál de las siguientes opciones se está inicializando correctamente una constante? const double myvar= 24.2; const double(myvar):24; void const myvar=24;. Cuando se define double mivector[20]; ¿qué es lo que estamos haciendo? Declarando un vector unidimensional de tipo double y de longitud 20. Declarando un vector e inicializarlo con los valores del 1 al 20 Declarando un vector de 20 dimensiones de forma dinámica. La declaración de un array de enteros de dos dimensiones puede codificarse: int array2D[2][2] ={{1,2},{3,4}}; int array2D[][2] ={{1,2},{3,4}}; Ambas opciones son correctas. Los argumentos de las funciones en C se pasan por: La directiva #define Funciones de tipo global. Valor. Una forma de declarar un array utilizando memoria contigua sería: int *array = malloc (sizeof (int)*2); ambas opciones son correctas. int *array = calloc ((size_t)2, sizeof (int));. La función malloc() permite: inicializar arrays estáticos que hemos definido previamente y que queremos que apunten a null. pedir un bloque de memoria contiguo cuando estamos declarando arrays/matrices de forma dinámica. liberar un bloque de memoria que hemos pedido previamente y que no queremos volver a utilizar. Para copiar el contenido de un array en otro en C: se debe hacer a mano o con funciones como memcpy(destino, origen,num_bytes) utilizamos el operador “=”. Ambas opciones son correctas. Una forma de definir constantes en nuestros programas C es: #define TIPODEDATO NOMBRE = VALOR #include NOMBRE VALOR #define NOMBRE VALOR. El programa, ¿qué imprime por pantalla? a=30, b=20 a=31, b=21 a=30, b=50 a=31, b=51. Si el resultado de compilar y enlazar el programa es el ejecutable prog, ¿qué imprimirá el siguiente comando? $ ./prog lunes martes lunes prog martes lunes lunes lunes lunes lunes martes lunes prog lunes. Con la siguiente declaración: int x[ ]={3,2,8,7,5}, *p; *p=x; ¿Cuál de las respuesta es INCORRECTA? La instrucción printf("%d", *p++); imprime 3 La instrucción printf("%d", *(x+3)); imprime 7 La instrucción printf("%d", *x+3); imprime 6 La instrucción printf("%d", (*x)++); imprime 3. ¿Qué imprime el programa, si al ejecutarlo se introducen los valores 3 y 4 para las variables a y b? 3.0,4.0 3.0,-1.0 7.0,-1.0 7.0,4.0. ¿Qué imprime programa ? 11 10 20 11 11 20 11 10 21 11 11 21. Suponiendo que se ha dado la orden de compilación gcc prog.c, indicar qué imprime el programa cuando se ejecuta la orden: ./a.out lunes_ martes_ miercoles_ a. outlunes_martes_miercoles_miercoles_ martes_miercoles lunes_martes_miercoles lunes_martes_miercoles_miercoles. El hecho de que C sea un lenguaje de tipado estático, significa que en nuestros programas debemos: Convertir cada variable al tipo específico “int” antes de poder operar con punteros. Definir de un tipo cada variable antes de poder utilizarla. Realizar la asignación de tipos en tiempo de ejecución. Los comentarios en C se indican con: // cuando es una sola línea la que queremos comentar /* y terminando con */ cuando queremos comentar varias líneas ambas opciones son correctas. En un array en C, por ejemplo, double array[5]; ¿Cómo se accede al último elemento del array? array[5]; array[]; array[4];. En una zona delimitada por “{}”, las variables definidas ahí quedan limitadas a esa región. las variables son de tipo global y pueden ser llamadas desde otras subrutinas. Ninguna de las opciones es correcta. ¿Es posible definir varias variables del mismo tipo en la misma línea? Sí, si las separamos por comas. Sí, pero sólo cuando sean constantes. No. ¿Sería esta una función válida: int Restar (int, int);? No, ya que no se sabe cual es el tipo del resultado de la operación No, ya que una función no puede recibir argumentos sin punteros. Sí, es una función que resta dos enteros. ¿Qué es la función main? Es la entrada del programa y por donde empieza la ejecución. Es una función que se ejecuta al final del programa y contiene la directiva return. Es una función que debemos incluir cuando vayamos a leer argumentos del programa por consola. La principal diferencia entre las funciones malloc() y calloc() es que: malloc() nos propociona el bloque como esté, sin inicializar; mientras que calloc() lo inicializa a 0. calloc() nos propociona el bloque como esté, sin inicializar; mientras que malloc() lo inicializa a 0 con malloc() no se recomienda el uso de la función free(). Si quiero acceder a todos los elementos del array puedo: Crear una estructura while que vaya pasando por todos los elementos del array. Crear un bucle for que vaya pasando por todos los elementos del array. Ambas opciones son correctas. ¿Qué arquitectura es la más rara actualmente? MIMD MISD SISD. ¿Cual es la diferencia entre concurrencia y paralelismo? Las tareas concurrentes se ejecutan en el mimo elemento de procesamiento y las paralelas en distintos. Las tareas paraleas se ejecutan en el mismo elemento de procesamiento y las concurrentes en distintos. Ninguna de las otras respuestas. Los programas desarrollados en MPI pueden correr Ambas respuestas son correctas En arquitecturas de memoria distribuida En arquitecturas de memoria compartida. Un algoritmo paralelo está muy desbalanceado Cuando sus tareas/procesos realizan una cantidad de computación muy diferente Cuando sus tareas/procesos realizan casi la misma cantidad de computación Cuando las tareas/procesos del algoritmo realizan una cantidad de comunicaciones muy diferente. ¿Que es el estándar POSIX? Una propuesta para un nuevo sistema operativo que suceda a UNIX. Un estándar que describe interfaces que todas las variantes complicadas de UNIX necesitan implementar. Una distribución UNIX que tuvo que cambiar de nombre debido a reclamaciones legales. ¿Cuál es la sintaxis correcta para abrir una conexión ssh? ssh [options] <username>@<hostname> ssh <username>:<hostname> [options] ssh [options] <username> <hostname>. ¿Cómo se llama al administrador de nivel superior (o superusuario) en Linux? root Dios gurú. ¿Cuál puede ser un comodín adecuado para una lista de los archivos: test_01, test_02, test_03 y prod_02 pero NO: test_04 y debug_02 [t,p]???_0[1-3] *_* [t,p]*_* *_0[1-3]. ¿Qué es una distribución? Una colección preconfigurada de kernel de Linux y aplicaciones que lo acompañan. Un servidor de archivos público que aloja el kernel de Linux y algunas aplicaciones del sistema. Una instalación completa del sistema operativo con todas las herramientas y aplicaciones de apoyo. Ninguna de las anteriores. Si se ejecuta el comando cd sin argumentos en el directorio /var/log/, ¿qué espera que suceda? Va al directorio de inicio del usuario Va a la raíz del sistema de archivos Nada, se queda /var/log/. Dado el array dinámico a de 5 elementos de tipo int, queremos ampliar a 10 su número de elementos, sin perder la información que ya existía almacenada en el array original y rellenando a 0 los nuevos elementos. Suponer que no existirán problemas de falta de memoria. ¿Cuál de las secuencias de instrucciones NO hace lo especificado en el enunciado? a = (int *)realloc(a, 10*sizeof(int)); for (i=5; i<10; i++) a[i]=0; b = (int *)malloc(10*sizeof(int)); for (i=0; i<5; i++) b[i]=a[i]; for (i=5; i<10; i++) b[i]=0; free(a); a=b; b = (int *)calloc(10, sizeof(int)); for (i=0; i<5; i++) b[i]=a[i]; free(a); a=b; b = (int *)malloc(10*sizeof(int)); for (i=0; i<5; i++) b[i]=a[i]; for (i=5; i<10; i++) b[i]=0; free(a); b=a;. Con las siguientes declaraciones, indique cual de las instrucciones es INCORRECTA: struct ficha{ char nom[40]; int edad; }; struct ficha *pun=NULL; pun=(struct ficha *)malloc(sizeof(struct ficha *)); pun=(struct ficha *)malloc(4*sizeof(struct ficha)); pun=(struct ficha *)realloc(pun,5*sizeof(struct ficha)); pun=(struct ficha *)calloc(3,sizeof(struct ficha));. Muchos de los procesadores actuales se pueden categorizar como SIMD Si, porque tienen operaciones como las MMX, SSE o AVX que se realizan en registos especializados hardware. No, solo las GPUs se consideran procesadores vectorizados. Ninguna de las otras opciones. ¿Que hace la clausula nowait? Quita la barrera de sincronización en la siguiente construcción OpenMP. Quita la barrera de sincronización en la construcción OpenMP actual. Salta la siguiente construcción OpenMP. Prioriza la siguiente construcción OpenMP. Cuando de compila un programa OpenMP con gcc, ¿Qué flag debe incluirse? -fopenmp ./openmp #pragma omp parallel. En una clausula schedule(guided,chunk) El tamaño del chunk se reduce de manera exponencial conforme se asignan porciones a las hebras. El chunk determina la porción más pequeña posible. Las iteraciones de dividen en porciones de tamaño chunk. Cuando una hebra termina su porción, obtiene la siguiente porción sin computar. El chunk por defecto es 1. Hace que las iteraciones del bucle se dividan en porciones entre las hebras con un número de iteraciones especificado en chunk. Las porciones se asignan estáticamente a las hebras siguiendo una estrategia round-robin. Por defecto el chunk es el resultado de dividir el número de iteraciones a paralelizar entre el número de hebras. ¿Cual es la condición de carrera en el siguiente código? sum = 0; #pragma omp parallel for for (int i=1; i<N; i++){ sum = sum + b[i]; } /* end of omp parallel for */ Que la variable b es compartida. La variable sum es por defecto compartida. No hay condición de carrera. Todas las variables en la clausula shared de una construcción OpenMP son compartidas por todas las hebras (menos los contadores de los bucles) Falso No, los contadores de los bucles hay que declararlos como private. Verdadero. La clausula schedule(static,chunk) El tamaño del chunk se reduce de manera exponencial conforme se asignan porciones a las hebras. El chunk determina la porción más pequeña. Hace que las iteraciones del bucle se dividan en porciones entre las hebras con un número de iteraciones especificado en chunk. Las porciones se asignan estáticamente a las hebras siguiendo una estrategia round-robin. Por defecto el chunk es el resultado de dividir el número de iteraciones a paralelizar entre el número de hebras. Las iteraciones de dividen en porciones de tamaño chunk. Cuando una hebra termina su porción, obtiene la siguiente porción sin computar. El chunk por defecto es 1. ¿Qué hay que realizar en el siguiente código para que sea correcto? #pragma omp parallel for shared(a,b) for (int i=1; i<N; i++){ x = sqrt(b[i]) -1; a[i] = x*x + 2*x + 1; } /* end of omp parallel for */ Nada, el código es correcto Poner la clausula private(x) en la directiva OpenMP Poner la clausula private(a,b) en la directiva OpenMP. ¿Cual de los siguientes errores de programación paralela es imposible en la directiva OpenMP dada? Interbloqueo en #pragma omp parallel Condiciones de carrera en #pragma omp parallel Conflicto de datos en #pragma omp critical Dependencia de datos en #pragma omp for. ¿Cual de las siguientes afirmaciones sobre OpenMP es incorrecta? OpenMP se ha diseñado para sistemas paralelos de memoria distribuida y garantiza el uso eficiente de la memoria. OpenMP es una API que permite paralelismo multi-hebra explícito. Los componentes principales de OpenMP son directivas, librerias run-time y variables de entorno. OpenMP soporta arquitecturas UMA y NUMA. ¿Que significa el false sharing? Que las variables definidas en la clausula share() se inicializan por defecto a false. Que varias hebras están acediento a la misma línea de caché y la línea completa tiene que actualizarse en las caches privadas de las hebras cuando una hebra escribe un dato que se encuentra en esa línea de cache , lo que consume mucho tiempo. Que las hebras comparten variables, pero en realidad tienen una copia local privada de las mismas. Un string es Una función que sirve para pasar de tipo entero a tipo carácter. ninguna de las opciones es correcta. Un array de char que termina con el carácter ‘\0’. Tras compilar, ¿cómo se ejecuta un programa en C? nombredelprograma execute nombredelprograma ./nombredelprograma. Puedo controlar que el número de parámetros por consola es el que deseo, utilizando: while (argv < unciertovalor) if (argc < unciertovalor) if (argv < unciertovalor). ¿Cuál es el resultado esperado de los siguientes comandos: VARTEST="bla"; export VARTEST="BLA" ; VARTEST="blub"; env | grep VARTEST VARTEST="bla" VARTEST="blub" VARTEST="". ¿Cómo se establecen los permisos de un proceso? Por herencia de los permisos del propietario. Manualmente por usuario Explícitamente al inicio por parámetros. ¿Cuántos sistemas HPC del Top500 utilizaron alguna forma de Linux en junio de 2020? 80% 90% 100%. ¿Qué significa GNU? GNU no es Unix Geek necesitaba Unix Unix general Ninguna de las anteriore. Una hebra Al copiar los recursos del proceso padre, su tiempo de creación es igual que el de crear un proceso. Duplica solo los recursos necesarios del proceso padre para poder ser manejada de forma independiente. Es una copia exacta del proceso padre. ¿Cuál de las siguientes API se puede utilizar para la sincronización entre hebras? pthread_self pthread_exit pthread_join. La hebra que llega a un pthread_mutex_lock() Si el mutex está bloqueado, sigue la ejecución por la instrucción siguiente pthread_mutex_unlock() Ninguna de las anteriores Solo continua si el mutex no está bloqueado. Si el main y las NThreads que se han creado tienen que esperar en un barrier, el comando para inicializar el barrier sería pthread_barrier_init(&barrier, NULL, NThreads-1); pthread_barrier_init(&barrier, NULL, NThreads+1) pthread_barrier_init(&barrier, NULL, NThreads);. #include <stdio.h> #include <pthread.h> #define NUM_THREADS 4 pthread_once_t once_control = PTHREAD_ONCE_INIT; //----------------------------------------------------------------------------- void inicializacion(){ printf("Tarea a ejecutar\n"); } //----------------------------------------------------------------------------- void* cuerpo(void* arg){ pthread_once(&once_control, inicializacion); printf("Función normal\n"); return 0; } //----------------------------------------------------------------------------- int main(int argc, char* argv[]) { pthread_t thread[NUM_THREADS]; for (int i = 0; i<NUM_THREADS; i++) pthread_create(&thread[i], NULL, cuerpo, NULL); for (int i = 0; i<NUM_THREADS; i++) pthread_join(thread[i], NULL); return 0; } "Tarea a ejecutar" se imprime solo una vez. Ninguna de las anteriores "Tarea a ejecutar" se imprime NUM_THREADS veces. Cuál es el flag que se pasa al compilar un programa PThread usando gcc? -pthread -lpthread -gccpthread. Cuando se usa pthread_cond_wait() NS7NC Antes hay que bloquear el mutex asociado. No se requieren mutex adicionales. Ninguna de las anteriores. Si el main está esperando en una variable de condición en un bucle y dos hebras hacen un signal antes del siguiente wait El main saldrá solo de un wait aunqnue se hayan realizado dos signal. El main se bloquea hasta que todas has hebras hayan hecho un signal. El main saldrá de dos wait, uno en cada iteración del bucle, porque se han hecho dos signals. #include <stdio.h> #include <stdlib.h> #include <pthread.h> typedef struct th_params { pthread_mutex_t * pmutex1; int * pcounter; }Type_Th_Params; //---------------------------------- void *functionC(void * param) { Type_Th_Params * MyParams; MyParams=(Type_Th_Params *) param; pthread_mutex_lock( MyParams->pmutex1 ); (*MyParams->pcounter)++; printf("Counter value: %d\n", *MyParams->pcounter); pthread_mutex_unlock( MyParams->pmutex1 ); } //----------------------------------- int main() { pthread_t thread1, thread2; pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; int counter=0; Type_Th_Params Th_Params; Th_Params.pcounter=&counter; Th_Params.pmutex1=&mutex1; pthread_create( &thread1, NULL, functionC, (void *)&Th_Params ); pthread_create( &thread2, NULL, functionC, (void *)&Th_Params ); pthread_join( thread1, NULL); pthread_join( thread2, NULL); exit(0); } Error ya que ambas hebras comparten la misma estructura de datos. Counter value: 1 Counter value: 1 Counter value: 1 Counter value: 2. Las hebras Se ejecutan en un entorno de memoria distribuida y se comunican accediendo a esa memoria. Se ejecutan en un entorno de memoria distribuida y se comunican mediante paso de mensajes. Se ejecutan en un entorno de memoria compartida y se comunican mediante el acceso a esa memoria. MPI_Iprobe() Se bloquea si el mensaje que se espera no ha llegado. Solo puede chequear si ha llegado un mensaje de una fuente y con un tag especificados. Se utiliza para saber si ha llegado un mensaje con cualquier fuente y tag, o con fuente y tag especificados. El proceso que lo ejecuta no se bloquea si no ha llegado. MPI_Send(message, 4, MPI_CHAR, 5, tag, MPI_COMM_WORLD) envía un mensaje al proceso: 4 5 tag. El comando MPI_Get_count sirve para... Saber la fuente, la etiqueta y el número de elementos del tipo de datos recibido antes de leerlos Para saber cuantos mensajes están pendientes de lectura. Para saber el número de bytes recibidos en el mensaje antes de leerlo. El parámetro request en las rutinas de comunicación no bloqueantes sirve: Para conocer el emisor y el tag del mensaje Para poder saber si el envío del mensaje se ha completado al usarlo como parámetro en un MPI_Wait o MPI_Test Para establecer la etiqueta usada en el mensaje y poder seleccionar el mensaje a leer por esa etiqueta. El comando MPI_Comm_size()... solo funciona con el comunicador MPI_COMM_WORLD siempre devuelve el número de tareas MPI disponibles en la aplicación devuelve el número de procesos en el comunicador especificado. Marca la rutina que no tiene un comunicador: MPI_Init() MPI_Send() MPI_Bcast(). ¿Cuál es el significado de una rutina MPI de paso de mensaje bloqueante? La rutina retoma cuando la transmisión del mensaje se ha realizado completamente. La rutina bloquea todas las acciones MPI en los otros procesos hasta que se hayan completado sus acciones La rutina retoma inmediatamente, pero la transmisión del mensaje podría no haberse completado La rutina retoma cuando todas las acciones MPI locales se han completado, pero la transmisión del mensaje podría no haberse completado. La función MPI_Init() ... Debe llamarse en cada programa MPI antes de usar otras funciones MPI y solo debe llamarse una sola vez. Solo debe ejecutarse en el proceso root. Se puede ejecutar varias veces en un proceso MPI. El comando >mpirun -np 4 xterm -hold -e MPI_hello Ejecuta 4 terminales xterm en los cuales se ejecuta un proceso MPI_hello. Los terminales se mantendrán visibles y el usuario debe cerrarlos. Ejecuta 4 procesos MPI_hello. Las salidas por pantalla de los procesos MPI aparecen desordenadas en el mismo terminal. Ejecuta 4 procesos MPI_hello. Las salidas por pantalla de los procesos MPI aparecen ordenadas en el mismo terminal. ¿Se puede enviar un vector donde cada elemento es una estructura con distintos tipos de datos en MPI? No, solo si la estructura tiene elementos del mismo tipo de datos No, MPI solo permite el envío de datos predefinidos en C Sí, si se crea un tipo de datos derivado MPI_Type_struct. MPI_Probe se utiliza ... Para bloquearse hasta que haya llegado un mensaje del que no se sabe el emisor ni la etiqueta. Para ver si ha llegado un mensaje del que no se sabe el emisor ni la etiqueta, sin bloquearse Para recibir solo los mensajes que se han enviado con MPI_Isend(). Un proceso MPI tiene que saber el proceso que le envía el mensaje y la etiqueta asociada. Sí, para ponerlos en la correspondiente rutina de recepción. No, puede recibir en esa rutina cualquier proceso y con cualquier etiqueta si usa MPI_ANY_SOURCE y MPI_ANY_TAG. Puede recibir de cualquier proceso pero debe saber la etiqueta. El comando MPI_Finalize ... Todas las otras opciones son verdaderas Termina la ejecución del entorno MPI Puede no ser la última rutina MPI llamada por un proceso MPI. ¿Cuándo retorna la rutina MPI_Recv()? Después de que llegue el mensaje que la rutina espera y se han recopilado los datos del mensaje Después del tiempo especificado en la rutina. Después de que llegue el mensaje que la rutina espera, pero antes de que se hayan recopilado los datos del mensaje. ¿En qué rutinas MPI se usa status o request? El status se usa para esperar a que se haya realizado la acción y request para saber la fuente del mensaje. Request se usa en las rutinas de recepción bloqueantes y status en las no bloqueantes ya sean de emisión o recepción. Status se usa en las rutinas de recepción bloqueantes y request en las no bloqueantes ya sean de emisión o recepción. MPI_Recv(message, 4, MPI_CHAR, 5, tag, MPI_COMM_WORLD, &status) Describe el parámetro tag: Es el tipo de message en el mensaje de recepción Es el tipo del método de comunicación. Es un número asignado por el usuario que debe casar en ambos, emisor y receptor Es el tipo de grupo de procesos. Si Rank en el siguiente código es el rango del proceso actual y size es el número de procesos mpi en el comunicador, qué sentencia es verdadera: for(i=0; i<size; i++) { If(rank== i) { Printf(“Hello from rank %d\n”, rank); j = 10*I; } } El valor final de j es 10*(size-1) en todos los procesos El bucle asegura que todas las operaciones se realizan en paralelo en todos los procesos. El valor final de j es 10*Rank en el proceso Rank. El bucle asegura que todas las operaciones se ejecutan en orden: Rank 0 primero, Rank 1 después,... ¿Qué significa una rutina MPI de paso de mensaje no bloqueante (o asíncrona)? La rutina retorna inmediatamente, pero la transferencia del mensaje podría no haberse realizado La rutina retorna cuando todas las acciones MPI del proceso local se han realizado, pero la transferencia del mensaje puede no haber sido completada. La rutina retorna cuando se ha completado la transferencia del mensaje La rutina bloquea las acciones MPI de otros procesos hasta que se hayan completado las acciones del proceso actual. ¿Qué debe cumplir una comunicación colectiva? La rutina colectiva debe recibirse con una rutina punto-a-punto en cada proceso. La rutina colectiva usa el mismo tag en todos los procesos. Todos los procesos deben llamar a la rutina colectiva. ¿Cual es el nombre del comunicador MPI por defecto? COMM_WORLD MPI_COMM_WORLD DEF_MPI_COMM_WORLD. Las rutinas de comunicación punto-a-punto bloqueantes de envío y recepción Se pueden recibir o enviar, resp. en los otros procesos con rutinas colectivas. Se pueden recibir o enviar, resp en el otro proceso con rutinas punto-a-punto solo bloqueantes. Se pueden recibir o enviar, resp. en el otro proceso con rutinas punto-a-punto bloqueantes o no bloqueantes. ¿Cual es la diferencia entre MPI_Wait() y MPI_Test()? MPI_Wait() se una con MPI_Recv() y MPI_Test() con MPI_IRecv() MPI_Wait() es bloqueante y MPI_Test() es no bloqueante MPI_Wait() es no bloqueante y MPI_Test() es bloqueante. MPI_Irecv() El proceso que lo ejecuta necesita realizar un MPI_Wait() para estar seguro de que se han recibido los datos. Normalmente el siguiente comando es un MPI_Wait() Se puede usar el bufer de recepción en los siguientes comandos ya que es bloqueante. ¿Cual de estas rutinas se bloquea hasta que se haya recibido o enviado el mensaje no bloqueante? MPI_Test() MPI_Get_count() MPI_WAIT(). ¿Cuales son los tres usos más importantes de las rutinas de comunicación punto-a-punto no bloqueantes MPI? Ordenadas de mayor importancia primero a menor importancia el último. Prevenir serializaciones Prevenir interbloqueos Solapar comunicación y computación Prevenir interbloqueos Prevenir serializaciones Solapar comunicación y computación Solapar comunicación y computación Prevenir interbloqieos Prevenir serializaciones. MPI_Send(message, 13, MPICHAR, x, 10, MPI_COMM_WORLD); ¿Cuando puede modificarse x sin que se afecte el mensaje que se envía? Cuando la rutina retorna, es decir en los comandos siguientes a este. Antes de ejecutar la rutina. Cualquiera de las opciones. En cualquier momento. ¿Qué devuelve MPI_COMM_RANK? El número de procesos en un programa MPI El identificador numérico del proceso actual dentro de un comunicador MPI El Identificador del proceso Linux La prioridad del proceso actual. MPI_Probe() se utiliza Para bloquearse hasta que haya llegado un mensaje del que no se sabe el emisor ni la etiqueta. Para ver si ha llegado un mensaje del que no se sabe el emisor ni la etiqueta, sin bloquearse. Para recibir solo los mensajes que se han enviado con MPI_Isend(). MPI_Isend() El programa continua sin esperar que se haya completado el envío. Es necesario hacer un MPI_Probe() en el mismo proceso que hizo el MPI_Isend para ver si se ha completado el envío. El programa no continúa su ejecución hasta que se jaya completado el envío. El parámetro status en el MPI_Recv() sirve para Para poder realizar después un MPI_Test() y chequear que se han recibido los datos. Saber la fuente y la etiqueta del remitente del mensaje. Para poder realizar después un MPI_Wait() y estar seguro de que se han recibido los datos. ¿Qué combinación de rutinas MPI entre dos procesos vecinos que tienen que recibir y enviar datos uno del otro es más eficiente? No se sabe ya que MPI es portable pero no su eficiencia. MPI_Irecv + MPI_Send MPI_Isend + MPI_Irecv. ¿Cual de los siguientes datos no es requerido en una llamada de paso de mensaje? La dirección de comienzo de los datos del mensaje. El tipo de mensaje El tamaño de los datos del mensaje en número de bytes. El número de elementos de datos en el mensaje. MPI_Gather() Es una rutina colectiva que sirve para recoger las partes del bufer de recepción que se encuentran en los procesos dentro de un comunicador. Es una rutina colectiva que sirve para dividir los datos del bufer de envío entre los procesos dentro de un comunicador. Es una rutina colectiva que sirve para enviar el mismo mensaje desde el proceso root a los demás procesos dentro de un comunicador. El parámetro request en las rutinas de comunicación no bloqueantes sirve: Para poder saber si el envío del mensaje se ha completado al usarlo como parámetro en un MPI_Wait o MPI_Test. Para conocer el emisor y el tag del mensaje. Para establecer la etiqueta usada en el mensaje y poder seleccionar el mensaje a leer por esa etiqueta. ¿Cuales son los principales riesgos del MPI_Ssend()? Serialización. Interbloqueo. Todas las opciones. MPI_Iprobe() Se bloquea si el mensaje que se espera no ha llegado. Se utiliza para saber si ha llegado un mensaje con cualquier fuente y tag, o con fuente y tag especificados. El proceso que lo ejecuta no se bloquea si no ha llegado el mensaje. Solo puede chequear si ha llegado un mensaje de una fuente y tag especificados. ¿Cual de la siguientes sentencias es incorrecta sobre MPI? Las funciones MPI son estandarizadas, lo que significa que se comportan igual independientemente de la implementación MPI usada. Cualquier proceso MPI puede enviar y recibir mensajes directamente desde y hacia otro proceso. Puedes compilar el código MPI usando cualquier implementación MPI que se ejecute en tu arquitectura. MPI usa un modelo de programación basado en memoria compartida, lo que significa que todos los procesos pueden acceder a la memoria compartida. MPI_Scatter() Es una rutina colectiva que sirve para recoger las partes del bufer de recepción que se encuentran en los procesos dentro de un comunicador. Es una rutina colectiva que sirve para enviar el mismo mensaje desde el proceso root a los demás procesos dentro de un comunicador. Es una rutina colectiva que sirve para dividir los datos del bufer de envío entre los procesos dentro de un comunicador. Si el proceso 3 manda un mensaje con tag 7 antes que otro mensaje con tag 8 al proceso 5 El proceso 5 debe leer primero el mensaje con tag 7 y luego el mensaje con tag 8 ya que MPI garantiza que los mensajes no se adelantan unos a otros. El proceso 5 puede leer primero el mensaje con tag 8 y luego el mensaje con tag 7 El proceso 3 no puede mandar el mensaje con tag 8 hasta que no se haya recibido el mensaje con tag 7. |
Denunciar Test