86 lines
2.1 KiB
C
86 lines
2.1 KiB
C
/* Copyright (c) 2024 Barcelona Supercomputing Center (BSC)
|
|
* SPDX-License-Identifier: GPL-3.0-or-later */
|
|
|
|
#include "common.h"
|
|
#include "compat.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
static long
|
|
fib(long index)
|
|
{
|
|
long a, b;
|
|
if (index <= 1)
|
|
return index;
|
|
#pragma oss task shared(a) label("fibonacci")
|
|
a = fib(index-1);
|
|
#pragma oss task shared(b) label("fibonacci")
|
|
b = fib(index-2);
|
|
#pragma oss taskwait
|
|
return a + b;
|
|
}
|
|
|
|
/* Outline task version */
|
|
#pragma oss task label("fibonacci")
|
|
static void
|
|
fib2(long index, long *res)
|
|
{
|
|
if (index <= 1) {
|
|
*res = index;
|
|
} else {
|
|
long a, b;
|
|
fib2(index-1, &a);
|
|
fib2(index-2, &b);
|
|
#pragma oss taskwait
|
|
*res = a + b;
|
|
}
|
|
}
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
FILE *f = fopen("/proc/sys/kernel/perf_event_paranoid", "r");
|
|
if (f == NULL)
|
|
die("cannot open /proc/sys/kernel/perf_event_paranoid:");
|
|
|
|
char buf[16] = {0};
|
|
if (fread(buf, 1, 16, f) <= 0)
|
|
die("cannot read /proc/sys/kernel/perf_event_paranoid:");
|
|
|
|
fclose(f);
|
|
|
|
/* We need the value 1 or less:
|
|
* Access to performance monitoring and observability operations is limited.
|
|
* Consider adjusting /proc/sys/kernel/perf_event_paranoid setting to open
|
|
* access to performance monitoring and observability operations for processes
|
|
* without CAP_PERFMON, CAP_SYS_PTRACE or CAP_SYS_ADMIN Linux capability.
|
|
* More information can be found at 'Perf events and tool security' document:
|
|
* https://www.kernel.org/doc/html/latest/admin-guide/perf-security.html
|
|
* perf_event_paranoid setting is 3:
|
|
* -1: Allow use of (almost) all events by all users
|
|
* Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
|
|
* >= 0: Disallow raw and ftrace function tracepoint access
|
|
* >= 1: Disallow CPU event access
|
|
* >= 2: Disallow kernel profiling
|
|
* To make the adjusted perf_event_paranoid setting permanent preserve it
|
|
* in /etc/sysctl.conf (e.g. kernel.perf_event_paranoid = <setting>)
|
|
*/
|
|
int level = atoi(buf);
|
|
if (level > 1)
|
|
die("requires perf_event_paranoid = 1 or less");
|
|
|
|
for (int i = 0; i < 30; i++)
|
|
fib(5);
|
|
|
|
#pragma oss taskwait
|
|
|
|
long res = 0;
|
|
for (int i = 0; i < 30; i++) {
|
|
fib2(5, &res);
|
|
#pragma oss taskwait
|
|
}
|
|
|
|
#pragma oss taskwait
|
|
return 0;
|
|
}
|