blob: 912914c7b8c9b827e173b34bc6fd4d087c8cbb2c [file] [log] [blame]
#include <Python.h>
#include <dlfcn.h>
#include <errno.h>
#include <omp-tools.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern void *ompd_library;
struct _ompd_aspace_cont {
int id;
};
struct _ompd_thread_cont {
int id;
};
ompd_address_space_context_t context = {42};
ompd_address_space_context_t invalidcontext = {99};
// call back functions for ompd_initialize
ompd_rc_t _alloc(ompd_size_t bytes, void **ptr);
ompd_rc_t _free(void *ptr);
ompd_rc_t _sizes(ompd_address_space_context_t *_acontext,
ompd_device_type_sizes_t *sizes);
ompd_rc_t _sym_addr(ompd_address_space_context_t *context,
ompd_thread_context_t *tcontext, const char *symbol_name,
ompd_address_t *symbol_addr, const char *file_name);
ompd_rc_t _read(ompd_address_space_context_t *context,
ompd_thread_context_t *tcontext, const ompd_address_t *addr,
ompd_size_t nbytes, void *buffer);
ompd_rc_t _read_string(ompd_address_space_context_t *context,
ompd_thread_context_t *tcontext,
const ompd_address_t *addr, ompd_size_t nbytes,
void *buffer);
ompd_rc_t _endianess(ompd_address_space_context_t *address_space_context,
const void *input, ompd_size_t unit_size,
ompd_size_t count, void *output);
ompd_rc_t _thread_context(ompd_address_space_context_t *context,
ompd_thread_id_t kind, ompd_size_t sizeof_thread_id,
const void *thread_id,
ompd_thread_context_t **thread_context);
ompd_rc_t _print(const char *str, int category);
/*
Test API: ompd_get_thread_handle
ompdtestapi threadandparallel
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
c
ompdtestapi ompd_get_thread_handle
for ompd_rc_unavailable:
ompd init
ompdtestapi ompd_get_thread_handle
*/
PyObject *test_ompd_get_thread_handle(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_thread_handle\"...\n");
PyObject *addrSpaceTup = PyTuple_GetItem(args, 0);
ompd_address_space_handle_t *addr_handle =
(ompd_address_space_handle_t *)PyCapsule_GetPointer(addrSpaceTup,
"AddressSpace");
PyObject *threadIdTup = PyTuple_GetItem(args, 1);
uint64_t threadID = (uint64_t)PyLong_AsLong(threadIdTup);
ompd_size_t sizeof_thread_id = sizeof(threadID);
ompd_thread_handle_t *thread_handle;
// should be successful
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_thread_handle(
addr_handle, 1 /*lwp*/, sizeof_thread_id, &threadID, &thread_handle);
if (rc == ompd_rc_unavailable) {
// ompd_rc_unavailable if the thread is not an OpenMP thread.
printf("Success. ompd_rc_unavailable, OpenMP is disabled.\n");
printf("This is not a Parallel Region, No more testing is possible.\n");
return Py_None;
} else if (rc != ompd_rc_ok)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
// as in ompd-types.h, only 0-3 are valid for thread kind
// ompd_rc_unsupported if thread kind is not supported.
printf("Test: Unsupported thread kind.\n");
rc = ompd_get_thread_handle(addr_handle, 4, sizeof_thread_id, &threadID,
&thread_handle);
if (rc != ompd_rc_unsupported)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
// ompd_rc_bad_input: if a different value in sizeof_thread_id is expected for
// a thread kind.
// sizeof_thread_id is validated at thread_context which is call back function
// "_thread_context" where we expect size to be sizeof(long int)
printf("Test: Wrong value for sizeof threadID.\n");
rc = ompd_get_thread_handle(addr_handle, 1 /*lwp*/, sizeof_thread_id - 1,
&threadID, &thread_handle);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL thread_handle.\n");
rc = ompd_get_thread_handle(addr_handle, 1 /*lwp*/, sizeof_thread_id,
&threadID, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
printf(
"Test: Expecting ompd_rc_error or stale_handle for NULL addr_handle.\n");
rc = ompd_get_thread_handle(NULL, 1 /*lwp*/, sizeof_thread_id, &threadID,
&thread_handle);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_curr_parallel_handle.
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
omptestapi ompd_get_curr_parallel_handle
for ompd_rc_unavailable
ompd init
omptestapi ompd_get_curr_parallel_handle (or break at line 4
before this)
*/
PyObject *test_ompd_get_curr_parallel_handle(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_curr_parallel_handle\"...\n");
PyObject *threadHandlePy = PyTuple_GetItem(args, 0);
ompd_thread_handle_t *thread_handle =
(ompd_thread_handle_t *)(PyCapsule_GetPointer(threadHandlePy,
"ThreadHandle"));
ompd_parallel_handle_t *parallel_handle;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_curr_parallel_handle(thread_handle, &parallel_handle);
if (rc == ompd_rc_unavailable) {
// ompd_rc_unavailable if the thread is not currently part of a team
// ToCheck: Even in non parallel region, error code is stale_handle
// Need to find a test case for ompd_rc_unavailable ?????
printf("Success. ompd_rc_unavailable, Not in parallel region\n");
printf("No more testing is possible.\n");
return Py_None;
} else if (rc == ompd_rc_stale_handle) {
printf("Return code is stale_handle, may be in non-parallel region.\n");
printf("No more testing is possible.\n");
return Py_None;
} else if (rc != ompd_rc_ok)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL parallel_handle.\n");
rc = ompd_get_curr_parallel_handle(thread_handle, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or stale_handle for NULL "
"thread_handle.\n");
rc = ompd_get_curr_parallel_handle(NULL, &parallel_handle);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_thread_in_parallel.
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(3);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
omptestapi ompd_get_thread_in_parallel
*/
PyObject *test_ompd_get_thread_in_parallel(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_thread_in_parallel\"...\n");
PyObject *parallelHandlePy = PyTuple_GetItem(args, 0);
ompd_parallel_handle_t *parallel_handle =
(ompd_parallel_handle_t *)(PyCapsule_GetPointer(parallelHandlePy,
"ParallelHandle"));
ompd_thread_handle_t *thread_handle;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_thread_in_parallel(
parallel_handle, 1 /* lesser than team-size-var*/, &thread_handle);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// ompd_rc_bad_input: if the thread_num argument is greater than or equal to
// the team-size-var ICV or negative
printf("Test: Invalid thread num (199).\n");
rc = ompd_get_thread_in_parallel(parallel_handle, 199, &thread_handle);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Invalid thread num (-5).\n");
rc = ompd_get_thread_in_parallel(parallel_handle, -5, &thread_handle);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL thread_handle.\n");
rc = ompd_get_thread_in_parallel(parallel_handle, 1, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or stale_handle for NULL "
"parallel_handle.\n");
rc = ompd_get_thread_in_parallel(NULL, 1, &thread_handle);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_thread_handle_compare.
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(4);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
omptestapi ompd_thread_handle_compare
*/
PyObject *test_ompd_thread_handle_compare(PyObject *self, PyObject *args) {
printf("Testing \"ompd_thread_handle_compare\"...\n");
PyObject *threadHandlePy1 = PyTuple_GetItem(args, 0);
ompd_thread_handle_t *thread_handle1 =
(ompd_thread_handle_t *)(PyCapsule_GetPointer(threadHandlePy1,
"ThreadHandle"));
PyObject *threadHandlePy2 = PyTuple_GetItem(args, 1);
ompd_thread_handle_t *thread_handle2 =
(ompd_thread_handle_t *)(PyCapsule_GetPointer(threadHandlePy2,
"ThreadHandle"));
int cmp_value;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc =
ompd_thread_handle_compare(thread_handle1, thread_handle2, &cmp_value);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
if (cmp_value == 0) {
printf("Threads are Equal.\n");
} else {
// a value less than, equal to, or greater than 0 indicates that the thread
// corresponding to thread_handle_1 is, respectively, less than, equal to,
// or greater than that corresponding to thread_handle_2.
if (cmp_value <= 0) {
printf("Thread 1 is lesser than thread 2, cmp_val = %d\n", cmp_value);
printf("Test: Changing the order.\n");
rc = ompd_thread_handle_compare(thread_handle2, thread_handle1,
&cmp_value);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
}
if (cmp_value >= 0)
printf("Success now cmp_value is greater, %d.\n", cmp_value);
else
printf("Failed.\n");
} else {
printf("Thread 1 is greater than thread 2.\n");
printf("Test: Changing the order.\n");
rc = ompd_thread_handle_compare(thread_handle2, thread_handle1,
&cmp_value);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
}
if (cmp_value <= 0)
printf("Success now cmp_value is lesser, %d.\n", cmp_value);
else
printf("Failed.\n");
}
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL cmp_value.\n");
rc = ompd_thread_handle_compare(thread_handle2, thread_handle1, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or stale_handle for NULL "
"thread_handle.\n");
rc = ompd_thread_handle_compare(NULL, thread_handle1, &cmp_value);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
}
return Py_None;
}
/*
Test API: ompd_get_thread_id.
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
omptestapi ompd_get_thread_id
*/
PyObject *test_ompd_get_thread_id(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_thread_id\"...\n");
PyObject *threadHandlePy = PyTuple_GetItem(args, 0);
ompd_thread_handle_t *thread_handle =
(ompd_thread_handle_t *)(PyCapsule_GetPointer(threadHandlePy,
"ThreadHandle"));
uint64_t threadID;
ompd_size_t sizeof_thread_id = sizeof(threadID);
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_thread_id(thread_handle, 0 /*OMPD_THREAD_ID_PTHREAD*/,
sizeof_thread_id, &threadID);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
} else
printf("Success. Thread id = %ld\n", threadID);
// ompd_rc_bad_input: if a different value in sizeof_thread_id is expected for
// a thread kind of kind
printf("Test: Wrong sizeof_thread_id.\n");
rc = ompd_get_thread_id(thread_handle, 0 /*OMPD_THREAD_ID_PTHREAD*/,
sizeof_thread_id - 1, &threadID);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
// ompd_rc_unsupported: if the kind of thread is not supported
printf("Test: Unsupported thread kind.\n");
// thread kind currently support from 0-3, refer in ompd-types.h
rc = ompd_get_thread_id(thread_handle, 4, sizeof_thread_id - 1, &threadID);
if (rc != ompd_rc_unsupported)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL threadID.\n");
rc = ompd_get_thread_id(thread_handle, 0 /*OMPD_THREAD_ID_PTHREAD*/,
sizeof_thread_id, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error for NULL thread_handle.\n");
rc = ompd_get_thread_id(NULL, 0 /*OMPD_THREAD_ID_PTHREAD*/, sizeof_thread_id,
&threadID);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_rel_thread_handle
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
omptestapi ompd_rel_thread_handle
*/
// TODO: This might not be the right way to do,as this handle comes from
// python not generated by ompd API
PyObject *test_ompd_rel_thread_handle(PyObject *self, PyObject *args) {
printf("Testing Not enabled for \"ompd_rel_thread_handle\"...\n");
printf("Disabled.\n");
return Py_None;
}
/*
Test API: ompd_get_enclosing_parallel_handle.
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. omp_set_num_threads(3);
9. #pragma omp parallel
10. {
11. printf ("Parallel level 2, thread num = %d",
omp_get_thread_num());
12. }
13. }
14. return 0;
15. }
GDB Commands:
ompd init
b 11
ompdtestapi ompd_get_enclosing_parallel_handle
for "ompd_rc_unavailable":
ompd init
omptestapi ompd_get_enclosing_parallel_handle
(or break at line 4 before this)
*/
PyObject *test_ompd_get_enclosing_parallel_handle(PyObject *self,
PyObject *args) {
printf("Testing \"ompd_get_enclosing_parallel_handle\"...\n");
PyObject *parallelHandlePy = PyTuple_GetItem(args, 0);
ompd_parallel_handle_t *parallel_handle =
(ompd_parallel_handle_t *)(PyCapsule_GetPointer(parallelHandlePy,
"ParallelHandle"));
ompd_parallel_handle_t *enclosing_parallel_handle;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_enclosing_parallel_handle(parallel_handle,
&enclosing_parallel_handle);
if (rc == ompd_rc_unavailable) {
// ompd_rc_unavailable: if no enclosing parallel region exists.
printf("Success. return code is ompd_rc_unavailable, Not in parallel "
"region\n");
printf("No more testing is possible.\n");
return Py_None;
} else if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL "
"enclosing_parallel_handle.\n");
rc = ompd_get_enclosing_parallel_handle(parallel_handle, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or stale_handle for NULL "
"parallel_handle.\n");
rc = ompd_get_enclosing_parallel_handle(NULL, &enclosing_parallel_handle);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_parallel_handle_compare.
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. omp_set_num_threads(3);
9. #pragma omp parallel
10. {
11. printf ("Parallel level 2, thread num = %d",
omp_get_thread_num());
12. }
13. }
14. return 0;
15. }
GDB Commands:
ompd init
b 11
ompdtestapi ompd_parallel_handle_compare
*/
PyObject *test_ompd_parallel_handle_compare(PyObject *self, PyObject *args) {
printf("Testing \"ompd_parallel_handle_compare\"...\n");
PyObject *parallelHandlePy1 = PyTuple_GetItem(args, 0);
ompd_parallel_handle_t *parallel_handle1 =
(ompd_parallel_handle_t *)(PyCapsule_GetPointer(parallelHandlePy1,
"ParallelHandle"));
PyObject *parallelHandlePy2 = PyTuple_GetItem(args, 1);
ompd_parallel_handle_t *parallel_handle2 =
(ompd_parallel_handle_t *)(PyCapsule_GetPointer(parallelHandlePy2,
"ParallelHandle"));
int cmp_value;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_parallel_handle_compare(parallel_handle1,
parallel_handle2, &cmp_value);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
if (cmp_value == 0) {
printf("Parallel regions are Same.\n");
} else {
// A value less than, equal to, or greater than 0 indicates that the region
// corresponding to parallel_handle_1 is, respectively, less than, equal to,
// or greater than that corresponding to parallel_handle_2
if (cmp_value <= 0) {
printf("Parallel handle 1 is lesser than handle 2, cmp_val = %d\n",
cmp_value);
printf("Test: Changing the order.\n");
rc = ompd_parallel_handle_compare(parallel_handle2, parallel_handle1,
&cmp_value);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
}
if (cmp_value >= 0)
printf("Success now cmp_value is greater, %d.\n", cmp_value);
else
printf("Failed.\n");
} else {
printf("Parallel 1 is greater than handle 2.\n");
printf("Test: Changing the order.\n");
rc = ompd_parallel_handle_compare(parallel_handle2, parallel_handle1,
&cmp_value);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
}
if (cmp_value <= 0)
printf("Success now cmp_value is lesser, %d.\n", cmp_value);
else
printf("Failed.\n");
}
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL cmp_value.\n");
rc = ompd_parallel_handle_compare(parallel_handle2, parallel_handle1, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or stale_handle for NULL "
"thread_handle.\n");
rc = ompd_parallel_handle_compare(NULL, parallel_handle1, &cmp_value);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
}
return Py_None;
}
/*
Test API: ompd_rel_parallel_handle
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
omptestapi ompd_rel_parallel_handle
*/
// TODO: Same as thread_rel_handle, might not be a right way to test
// What released should be provided by ompd API, this address is actually from
// python
PyObject *test_ompd_rel_parallel_handle(PyObject *self, PyObject *args) {
printf("Testing NOT enabled for \"ompd_rel_parallel_handle\"...\n");
printf("Disabled.\n");
return Py_None;
}
/*
Test API: ompd_initialize
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
b 4
ompdtestapi ompd_initialize\
*/
PyObject *test_ompd_initialize(PyObject *self, PyObject *noargs) {
printf("Testing \"test_ompd_initialize\"...\n");
ompd_word_t version;
ompd_rc_t rc = ompd_get_api_version(&version);
if (rc != ompd_rc_ok) {
printf("Failed in \"ompd_get_api_version\".\n");
return Py_None;
}
static ompd_callbacks_t table = {
_alloc, _free, _print, _sizes, _sym_addr, _read,
NULL, _read_string, _endianess, _endianess, _thread_context};
printf("Test: With Correct Arguments.\n");
ompd_rc_t (*my_ompd_init)(ompd_word_t version, ompd_callbacks_t *) =
dlsym(ompd_library, "ompd_initialize");
rc = my_ompd_init(version, &table);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
static ompd_callbacks_t invalid_table = {
NULL, /* _alloc, */
NULL, /* _free, */
NULL, /* _print,*/
NULL, /* _sizes, */
NULL, /* _sym_addr, */
NULL, /* _read,*/
NULL, NULL, /* _read_string, */
NULL, /* _endianess, */
NULL, /* _endianess, */
NULL, /* _thread_context */
};
// ompd_rc_bad_input: if invalid callbacks are provided
printf("Test: Invalid callbacks.\n");
rc = my_ompd_init(version, &invalid_table);
if (rc != ompd_rc_bad_input)
printf("Warning, with return code = %d\n", rc);
else
printf("Success.\n");
// ompd_rc_unsupported: if the requested API version cannot be provided
printf("Test: Wrong API version.\n");
rc = my_ompd_init(150847, &table);
if (rc != ompd_rc_unsupported)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL table.\n");
rc = my_ompd_init(version, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or ompd_rc_bad_input for NULL\n");
rc = my_ompd_init(0, &table);
if (rc != ompd_rc_unsupported && rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_api_version
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
ompdtestapi ompd_get_version
*/
PyObject *test_ompd_get_api_version(PyObject *self, PyObject *noargs) {
printf("Testing \"ompd_get_api_version\"...\n");
ompd_word_t version;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_api_version(&version);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
} else
printf("Success. API version is %ld\n", version);
printf(
"Test: Expecting ompd_rc_error or ompd_rc_bad_input for NULL version\n");
rc = ompd_get_api_version(NULL);
if (rc != ompd_rc_error && rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_version_string
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
omptestapi ompd_get_version_string
*/
PyObject *test_ompd_get_version_string(PyObject *self, PyObject *noargs) {
printf("Testing \"ompd_get_version_string\"...\n");
const char *string;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_version_string(&string);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
} else
printf("Success. API version is %s\n", string);
printf(
"Test: Expecting ompd_rc_error or ompd_rc_bad_input for NULL version\n");
rc = ompd_get_version_string(NULL);
if (rc != ompd_rc_error && rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_finalize
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
ompdtestapi ompd_finalize
b 4
r
ompdtestapi ompd_finalize
*/
PyObject *test_ompd_finalize(PyObject *self, PyObject *noargs) {
printf("Testing \"ompd_finalize\"...\n");
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_finalize();
if (rc == ompd_rc_ok)
printf("Ret code: ompd_rc_ok, Success if ompd is initialized.\n");
// ompd_rc_unsupported: if the OMPD library is not initialized.
else if (rc == ompd_rc_unsupported)
printf(
"Ret code: ompd_rc_unsupported, Success if ompd is NOT initialized.\n");
else
printf("Failed: Return code is %d.\n", rc);
return Py_None;
}
/*
Test API: ompd_process_initialize
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
*/
PyObject *test_ompd_process_initialize(PyObject *self, PyObject *noargs) {
printf("Testing \"ompd_process_initialize\"....\n");
ompd_address_space_handle_t *addr_handle;
// ompd_address_space_context_t context = {42};
printf("Test: with correct Args.\n");
ompd_rc_t rc = ompd_process_initialize(&context, &addr_handle);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
printf("Test: With Unsupported library.\n");
printf("Warning: Have to test manually with 32 and 64 bit combination.\n");
// ompd_address_space_context_t invalidcontext = {99};
printf("Test: with wrong context value.\n");
rc = ompd_process_initialize(&invalidcontext, &addr_handle);
if ((rc != ompd_rc_bad_input) && (rc != ompd_rc_incompatible) &&
(rc != ompd_rc_stale_handle))
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting stale handle or bad_input for NULL addr_handle.\n");
rc = ompd_process_initialize(&context, NULL);
if ((rc != ompd_rc_bad_input) && (rc != ompd_rc_stale_handle))
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_device_initialize
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
*/
PyObject *test_ompd_device_initialize(PyObject *self, PyObject *noargs) {
printf("Testing Not enabled for \"ompd_device_initialize\".\n");
printf("Disabled.\n");
return Py_None;
}
/*
Test API: ompd_rel_address_space_handle
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
*/
PyObject *test_ompd_rel_address_space_handle(PyObject *self, PyObject *noargs) {
printf("Testing Not enabled for \"ompd_rel_address_space_handle\".\n");
printf("Disabled.\n");
return Py_None;
}
/*
Test API: ompd_get_omp_version
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 10
c
ompdtestapi ompd_get_omp_version
*/
PyObject *test_ompd_get_omp_version(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_omp_version\" ...\n");
PyObject *addrSpaceTup = PyTuple_GetItem(args, 0);
ompd_address_space_handle_t *addr_handle =
(ompd_address_space_handle_t *)PyCapsule_GetPointer(addrSpaceTup,
"AddressSpace");
ompd_word_t omp_version;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_omp_version(addr_handle, &omp_version);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
} else
printf("Success. API version is %ld\n", omp_version);
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting stale handle or bad_input for NULL addr_handle.\n");
rc = ompd_get_omp_version(NULL, &omp_version);
if ((rc != ompd_rc_bad_input) && (rc != ompd_rc_stale_handle))
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or bad_input for NULL omp_version.\n");
rc = ompd_get_omp_version(addr_handle, NULL);
if (rc != ompd_rc_error && rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_omp_version_string
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
ompdtestapi ompd_get_omp_version_string
*/
PyObject *test_ompd_get_omp_version_string(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_omp_version_string\" ...\n");
PyObject *addrSpaceTup = PyTuple_GetItem(args, 0);
ompd_address_space_handle_t *addr_handle =
(ompd_address_space_handle_t *)PyCapsule_GetPointer(addrSpaceTup,
"AddressSpace");
const char *string;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_omp_version_string(addr_handle, &string);
if (rc != ompd_rc_ok) {
printf("Failed, with return code = %d\n", rc);
return Py_None;
} else
printf("Success. API version is %s\n", string);
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting stale handle or bad_input for NULL addr_handle.\n");
rc = ompd_get_omp_version_string(NULL, &string);
if ((rc != ompd_rc_bad_input) && (rc != ompd_rc_stale_handle))
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or bad_input for NULL omp_version.\n");
rc = ompd_get_omp_version_string(addr_handle, NULL);
if (rc != ompd_rc_error && rc != ompd_rc_bad_input)
printf("Failed, with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_curr_task_handle
Program:
1 #include <stdio.h>
2 #include <omp.h>
3 int get_fib_num (int num)
4 {
5 int t1, t2;
6 if (num < 2)
7 return num;
8 else {
9 #pragma omp task shared(t1)
10 t1 = get_fib_num(num-1);
11 #pragma omp task shared(t2)
12 t2 = get_fib_num(num-2);
13 #pragma omp taskwait
14 return t1+t2;
15 }
16 }
17
18 int main () {
19 int ret = 0;
20 omp_set_num_threads(2);
21 #pragma omp parallel
22 {
23 ret = get_fib_num(10);
24 }
25 printf ("Fib of 10 is %d", ret);
26 return 0;
27 }
GDB Commands:
ompd init
b 10
c
ompdtestapi ompd_get_curr_task_handle
*/
PyObject *test_ompd_get_curr_task_handle(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_curr_task_handle\"...\n");
PyObject *threadHandlePy = PyTuple_GetItem(args, 0);
ompd_thread_handle_t *thread_handle =
(ompd_thread_handle_t *)(PyCapsule_GetPointer(threadHandlePy,
"ThreadHandle"));
ompd_task_handle_t *task_handle;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_curr_task_handle(thread_handle, &task_handle);
if (rc == ompd_rc_unavailable) {
// ompd_rc_unavailable if the thread is not currently executing a task
printf(
"Success. Return code is ompd_rc_unavailable, Not executing a task.\n");
printf("No more testing is possible.\n");
return Py_None;
} else if (rc == ompd_rc_stale_handle) {
printf("Return code is stale_handle, may be in non parallel region.\n");
printf("No more testing is possible.\n");
return Py_None;
} else if (rc != ompd_rc_ok)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL parallel_handle.\n");
rc = ompd_get_curr_task_handle(thread_handle, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or stale_handle for NULL "
"thread_handle.\n");
rc = ompd_get_curr_task_handle(NULL, &task_handle);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_task_parallel_handle
Program:
1 #include <stdio.h>
2 #include <omp.h>
3 int get_fib_num (int num)
4 {
5 int t1, t2;
6 if (num < 2)
7 return num;
8 else {
9 #pragma omp task shared(t1)
10 t1 = get_fib_num(num-1);
11 #pragma omp task shared(t2)
12 t2 = get_fib_num(num-2);
13 #pragma omp taskwait
14 return t1+t2;
15 }
16 }
17
18 int main () {
19 int ret = 0;
20 omp_set_num_threads(2);
21 #pragma omp parallel
22 {
23 ret = get_fib_num(10);
24 }
25 printf ("Fib of 10 is %d", ret);
26 return 0;
27 }
GDB Commands:
ompd init
b 10
c
ompdtestapi ompd_get_task_parallel_handle
*/
PyObject *test_ompd_get_task_parallel_handle(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_task_parallel_handle\"...\n");
PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
ompd_task_handle_t *task_handle =
PyCapsule_GetPointer(taskHandlePy, "TaskHandle");
ompd_parallel_handle_t *task_parallel_handle;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc =
ompd_get_task_parallel_handle(task_handle, &task_parallel_handle);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL task_parallel_handle.\n");
rc = ompd_get_task_parallel_handle(task_handle, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf(
"Test: Expecting ompd_rc_error or stale_handle for NULL task_handle.\n");
rc = ompd_get_task_parallel_handle(NULL, &task_parallel_handle);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_generating_task_handle
Program:
1 #include <stdio.h>
2 #include <omp.h>
3 int get_fib_num (int num)
4 {
5 int t1, t2;
6 if (num < 2)
7 return num;
8 else {
9 #pragma omp task shared(t1)
10 t1 = get_fib_num(num-1);
11 #pragma omp task shared(t2)
12 t2 = get_fib_num(num-2);
13 #pragma omp taskwait
14 return t1+t2;
15 }
16 }
17
18 int main () {
19 int ret = 0;
20 omp_set_num_threads(2);
21 #pragma omp parallel
22 {
23 ret = get_fib_num(10);
24 }
25 printf ("Fib of 10 is %d", ret);
26 return 0;
27 }
GDB Commands:
ompd init
b 10
c
c // may or may not be needed
ompdtestapi ompd_get_generating_task_handle
*/
PyObject *test_ompd_get_generating_task_handle(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_generating_task_handle\"...\n");
PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
ompd_task_handle_t *task_handle =
(ompd_task_handle_t *)(PyCapsule_GetPointer(taskHandlePy, "TaskHandle"));
ompd_task_handle_t *generating_task_handle;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc =
ompd_get_generating_task_handle(task_handle, &generating_task_handle);
if (rc == ompd_rc_unavailable) {
// ompd_rc_unavailable if no generating task handle exists.
printf("Success. Return code is ompd_rc_unavailable\n");
printf("No more testing is possible.\n");
return Py_None;
} else if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf(
"Test: Expecting ompd_rc_bad_input for NULL generating_task_handle.\n");
rc = ompd_get_generating_task_handle(task_handle, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf(
"Test: Expecting ompd_rc_error or stale_handle for NULL task_handle.\n");
rc = ompd_get_generating_task_handle(NULL, &generating_task_handle);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_scheduling_task_handle
Program:
1 #include <stdio.h>
2 #include <omp.h>
3 int get_fib_num (int num)
4 {
5 int t1, t2;
6 if (num < 2)
7 return num;
8 else {
9 #pragma omp task shared(t1)
10 t1 = get_fib_num(num-1);
11 #pragma omp task shared(t2)
12 t2 = get_fib_num(num-2);
13 #pragma omp taskwait
14 return t1+t2;
15 }
16 }
17
18 int main () {
19 int ret = 0;
20 omp_set_num_threads(2);
21 #pragma omp parallel
22 {
23 ret = get_fib_num(10);
24 }
25 printf ("Fib of 10 is %d", ret);
26 return 0;
27 }
GDB Commands:
ompd init
b 10
c
ompdtestapi ompd_get_scheduling_task_handle
*/
PyObject *test_ompd_get_scheduling_task_handle(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_scheduling_task_handle\"...\n");
PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
ompd_task_handle_t *task_handle =
(ompd_task_handle_t *)(PyCapsule_GetPointer(taskHandlePy, "TaskHandle"));
ompd_task_handle_t *scheduling_task_handle;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc =
ompd_get_scheduling_task_handle(task_handle, &scheduling_task_handle);
if (rc == ompd_rc_unavailable) {
// ompd_rc_unavailable if no generating task handle exists.
printf(
"Success. Return code is ompd_rc_unavailable, No scheduling task.\n");
printf("No more testing is possible.\n");
return Py_None;
} else if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf(
"Test: Expecting ompd_rc_bad_input for NULL scheduling_task_handle.\n");
rc = ompd_get_scheduling_task_handle(task_handle, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf(
"Test: Expecting ompd_rc_error or stale_handle for NULL task_handle.\n");
rc = ompd_get_scheduling_task_handle(NULL, &scheduling_task_handle);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_task_in_parallel
Program:
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(4);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
c
ompdtestapi ompd_get_task_in_parallel
*/
PyObject *test_ompd_get_task_in_parallel(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_task_in_parallel\"...\n");
PyObject *parallelHandlePy = PyTuple_GetItem(args, 0);
ompd_parallel_handle_t *parallel_handle =
(ompd_parallel_handle_t *)(PyCapsule_GetPointer(parallelHandlePy,
"ParallelHandle"));
ompd_task_handle_t *task_handle;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_task_in_parallel(
parallel_handle, 1 /* lesser than team-size-var*/, &task_handle);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// ompd_rc_bad_input if the thread_num argument is greater than or equal to
// the team-size-var ICV or negative
printf("Test: Invalid thread num (199).\n");
rc = ompd_get_task_in_parallel(parallel_handle, 199, &task_handle);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Invalid thread num (-5).\n");
rc = ompd_get_task_in_parallel(parallel_handle, -5, &task_handle);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL task_handle.\n");
rc = ompd_get_task_in_parallel(parallel_handle, 1, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or stale_handle for NULL "
"parallel_handle.\n");
rc = ompd_get_task_in_parallel(NULL, 1, &task_handle);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_rel_task_handle
Program:
1 #include <stdio.h>
2 #include <omp.h>
3 int get_fib_num (int num)
4 {
5 int t1, t2;
6 if (num < 2)
7 return num;
8 else {
9 #pragma omp task shared(t1)
10 t1 = get_fib_num(num-1);
11 #pragma omp task shared(t2)
12 t2 = get_fib_num(num-2);
13 #pragma omp taskwait
14 return t1+t2;
15 }
16 }
17
18 int main () {
19 int ret = 0;
20 omp_set_num_threads(2);
21 #pragma omp parallel
22 {
23 ret = get_fib_num(10);
24 }
25 printf ("Fib of 10 is %d", ret);
26 return 0;
27 }
GDB Commands:
ompd init
b 10
c
ompdtestapi ompd_rel_task_handle
*/
PyObject *test_ompd_rel_task_handle(PyObject *self, PyObject *noargs) {
printf("Testing Not enabled for \"ompd_rel_task_handle\".\n");
printf("Disabled.\n");
return Py_None;
}
/*
Test API: ompd_task_handle_compare
Program:
1 #include <stdio.h>
2 #include <omp.h>
3 int get_fib_num (int num)
4 {
5 int t1, t2;
6 if (num < 2)
7 return num;
8 else {
9 #pragma omp task shared(t1)
10 t1 = get_fib_num(num-1);
11 #pragma omp task shared(t2)
12 t2 = get_fib_num(num-2);
13 #pragma omp taskwait
14 return t1+t2;
15 }
16 }
17
18 int main () {
19 int ret = 0;
20 omp_set_num_threads(2);
21 #pragma omp parallel
22 {
23 ret = get_fib_num(10);
24 }
25 printf ("Fib of 10 is %d", ret);
26 return 0;
27 }
GDB Commands:
ompd init
b 10
c
c
ompdtestapi ompd_task_handle_compare
*/
PyObject *test_ompd_task_handle_compare(PyObject *self, PyObject *args) {
printf("Testing \"ompd_task_handle_compare\"...\n");
PyObject *taskHandlePy1 = PyTuple_GetItem(args, 0);
ompd_task_handle_t *task_handle1 =
(ompd_task_handle_t *)(PyCapsule_GetPointer(taskHandlePy1, "TaskHandle"));
PyObject *taskHandlePy2 = PyTuple_GetItem(args, 1);
ompd_task_handle_t *task_handle2 =
(ompd_task_handle_t *)(PyCapsule_GetPointer(taskHandlePy2, "TaskHandle"));
int cmp_value;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc =
ompd_task_handle_compare(task_handle1, task_handle2, &cmp_value);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
if (cmp_value == 0) {
printf("Task Handles are Same.\n");
} else {
// a value less than, equal to, or greater than 0 indicates that the task
// that corresponds to task_handle_1 is, respectively, less than, equal to,
// or greater than the task that corresponds to task_handle_2.
if (cmp_value <= 0) {
printf("Task handle 1 is lesser than handle 2, cmp_val = %d\n",
cmp_value);
printf("Test: Changing the order.\n");
rc = ompd_task_handle_compare(task_handle2, task_handle1, &cmp_value);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
}
if (cmp_value >= 0)
printf("Success now cmp_value is greater, %d.\n", cmp_value);
else
printf("Failed.\n");
} else {
printf("Task 1 is greater than handle 2.\n");
printf("Test: Changing the order.\n");
rc = ompd_task_handle_compare(task_handle2, task_handle1, &cmp_value);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
}
if (cmp_value <= 0)
printf("Success now cmp_value is lesser, %d.\n", cmp_value);
else
printf("Failed.\n");
}
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL cmp_value.\n");
rc = ompd_task_handle_compare(task_handle2, task_handle1, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or stale_handle for NULL "
"task_handle.\n");
rc = ompd_task_handle_compare(NULL, task_handle1, &cmp_value);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
}
return Py_None;
}
/*
Test API: ompd_get_task_function
Program:
1 #include <stdio.h>
2 #include <omp.h>
3 int get_fib_num (int num)
4 {
5 int t1, t2;
6 if (num < 2)
7 return num;
8 else {
9 #pragma omp task shared(t1)
10 t1 = get_fib_num(num-1);
11 #pragma omp task shared(t2)
12 t2 = get_fib_num(num-2);
13 #pragma omp taskwait
14 return t1+t2;
15 }
16 }
17
18 int main () {
19 int ret = 0;
20 omp_set_num_threads(2);
21 #pragma omp parallel
22 {
23 ret = get_fib_num(10);
24 }
25 printf ("Fib of 10 is %d", ret);
26 return 0;
27 }
GDB Commands:
ompd init
b 10
c
ompdtestapi ompd_get_task_function
*/
PyObject *test_ompd_get_task_function(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_task_function\"...\n");
PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
ompd_task_handle_t *task_handle =
(ompd_task_handle_t *)(PyCapsule_GetPointer(taskHandlePy, "TaskHandle"));
ompd_address_t entry_point;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_task_function(task_handle, &entry_point);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success. Entry point is %lx.\n", entry_point.address);
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL entry_point.\n");
rc = ompd_get_task_function(task_handle, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf(
"Test: Expecting ompd_rc_error or stale_handle for NULL task_handle.\n");
rc = ompd_get_task_function(NULL, &entry_point);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_task_frame
Program:
1 #include <stdio.h>
2 #include <omp.h>
3 int get_fib_num (int num)
4 {
5 int t1, t2;
6 if (num < 2)
7 return num;
8 else {
9 #pragma omp task shared(t1)
10 t1 = get_fib_num(num-1);
11 #pragma omp task shared(t2)
12 t2 = get_fib_num(num-2);
13 #pragma omp taskwait
14 return t1+t2;
15 }
16 }
17
18 int main () {
19 int ret = 0;
20 omp_set_num_threads(2);
21 #pragma omp parallel
22 {
23 ret = get_fib_num(10);
24 }
25 printf ("Fib of 10 is %d", ret);
26 return 0;
27 }
GDB Commands:
ompd init
b 10
c
ompdtestapi ompd_get_task_frame
*/
PyObject *test_ompd_get_task_frame(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_task_frame\"...\n");
PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
ompd_task_handle_t *task_handle =
(ompd_task_handle_t *)(PyCapsule_GetPointer(taskHandlePy, "TaskHandle"));
ompd_frame_info_t exit_frame;
ompd_frame_info_t enter_frame;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_task_frame(task_handle, &exit_frame, &enter_frame);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL exit and enter frame.\n");
rc = ompd_get_task_frame(task_handle, NULL, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf(
"Test: Expecting ompd_rc_error or stale handle for NULL task_handle.\n");
rc = ompd_get_task_frame(NULL, &exit_frame, &enter_frame);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_state
Program:
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(4);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
c
ompdtestapi ompd_get_state
*/
PyObject *test_ompd_get_state(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_state\"...\n");
PyObject *threadHandlePy = PyTuple_GetItem(args, 0);
ompd_thread_handle_t *thread_handle =
(ompd_thread_handle_t *)(PyCapsule_GetPointer(threadHandlePy,
"ThreadHandle"));
ompd_word_t state;
ompt_wait_id_t wait_id;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_state(thread_handle, &state, &wait_id);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_error or stale handle for NULL "
"thread_handle.\n");
rc = ompd_get_state(NULL, &state, &wait_id);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_display_control_vars
Program:
1 #include <stdio.h>
2 #include <omp.h>
3 int get_fib_num (int num)
4 {
5 int t1, t2;
6 if (num < 2)
7 return num;
8 else {
9 #pragma omp task shared(t1)
10 t1 = get_fib_num(num-1);
11 #pragma omp task shared(t2)
12 t2 = get_fib_num(num-2);
13 #pragma omp taskwait
14 return t1+t2;
15 }
16 }
17
18 int main () {
19 int ret = 0;
20 omp_set_num_threads(2);
21 #pragma omp parallel
22 {
23 ret = get_fib_num(10);
24 }
25 printf ("Fib of 10 is %d", ret);
26 return 0;
27 }
GDB Commands:
ompd init
b 10
c
ompdtestapi ompd_get_display_control_vars
*/
PyObject *test_ompd_get_display_control_vars(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_display_control_vars\" ...\n");
PyObject *addrSpaceTup = PyTuple_GetItem(args, 0);
ompd_address_space_handle_t *addr_handle =
(ompd_address_space_handle_t *)PyCapsule_GetPointer(addrSpaceTup,
"AddressSpace");
const char *const *control_vars;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_display_control_vars(addr_handle, &control_vars);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting stale handle or bad_input for NULL addr_handle.\n");
rc = ompd_get_display_control_vars(NULL, &control_vars);
if ((rc != ompd_rc_bad_input) && (rc != ompd_rc_stale_handle))
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error or bad_input for NULL control_vars.\n");
rc = ompd_get_display_control_vars(addr_handle, NULL);
if (rc != ompd_rc_error && rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_rel_display_control_vars
Program:
1 #include <stdio.h>
2 #include <omp.h>
3 int get_fib_num (int num)
4 {
5 int t1, t2;
6 if (num < 2)
7 return num;
8 else {
9 #pragma omp task shared(t1)
10 t1 = get_fib_num(num-1);
11 #pragma omp task shared(t2)
12 t2 = get_fib_num(num-2);
13 #pragma omp taskwait
14 return t1+t2;
15 }
16 }
17
18 int main () {
19 int ret = 0;
20 omp_set_num_threads(2);
21 #pragma omp parallel
22 {
23 ret = get_fib_num(10);
24 }
25 printf ("Fib of 10 is %d", ret);
26 return 0;
27 }
GDB Commands:
ompd init
b 10
c
ompdtestapi ompd_rel_display_control_vars
*/
PyObject *test_ompd_rel_display_control_vars(PyObject *self, PyObject *noargs) {
printf("Testing Not enabled for \"ompd_rel_display_control_vars\".\n");
printf("Disabled.\n");
return Py_None;
}
/*
Test API: ompd_enumerate_icvs
Program:
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(2);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
c
ompdtestapi ompd_enumerate_icvs
*/
PyObject *test_ompd_enumerate_icvs(PyObject *self, PyObject *args) {
printf("Testing \"ompd_enumerate_icvs\"...\n");
PyObject *addrSpaceTup = PyTuple_GetItem(args, 0);
ompd_address_space_handle_t *addr_handle =
(ompd_address_space_handle_t *)PyCapsule_GetPointer(addrSpaceTup,
"AddressSpace");
ompd_icv_id_t current = 0; // To begin enumerating the ICVs, a tool should
// pass ompd_icv_undefined as the value of current
ompd_icv_id_t next_id;
const char *next_icv_name;
ompd_scope_t next_scope;
int more;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_enumerate_icvs(addr_handle, current, &next_id,
&next_icv_name, &next_scope, &more);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// ompd_rc_bad_input if an unknown value is provided in current
printf("Test: Unknown current value.\n");
rc = ompd_enumerate_icvs(
addr_handle,
99 /*unknown current value: greater than enum "ompd_icvompd_icv" */,
&next_id, &next_icv_name, &next_scope, &more);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf(
"Test: Expecting ompd_rc_bad_input for NULL next_id and next_icv_name\n");
rc =
ompd_enumerate_icvs(addr_handle, current, NULL, NULL, &next_scope, &more);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf(
"Test: Expecting ompd_rc_error or stale_handle for NULL addr_handle.\n");
rc = ompd_enumerate_icvs(NULL, current, &next_id, &next_icv_name, &next_scope,
&more);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_icv_from_scope
Program:
1 #include <stdio.h>
2 #include <omp.h>
3 int get_fib_num (int num)
4 {
5 int t1, t2;
6 if (num < 2)
7 return num;
8 else {
9 #pragma omp task shared(t1)
10 t1 = get_fib_num(num-1);
11 #pragma omp task shared(t2)
12 t2 = get_fib_num(num-2);
13 #pragma omp taskwait
14 return t1+t2;
15 }
16 }
17
18 int main () {
19 int ret = 0;
20 omp_set_num_threads(2);
21 #pragma omp parallel
22 {
23 ret = get_fib_num(10);
24 }
25 printf ("Fib of 10 is %d", ret);
26 return 0;
27 }
GDB Commands:
ompd init
b 10
c
ompdtestapi ompd_get_icv_from_scope
*/
PyObject *test_ompd_get_icv_from_scope_with_addr_handle(PyObject *self,
PyObject *args) {
printf("Testing \"ompd_get_icv_from_scope with addr_handle\"...\n");
PyObject *addrSpaceTup = PyTuple_GetItem(args, 0);
ompd_address_space_handle_t *addr_handle =
(ompd_address_space_handle_t *)PyCapsule_GetPointer(addrSpaceTup,
"AddressSpace");
ompd_word_t icv_value;
printf("Test: With Correct Arguments.\n");
// cannot import enum ompd_icv from omp-icv.cpp, hardcoding as of now, if enum
// changes it also requires modification
ompd_rc_t rc = ompd_get_icv_from_scope(
addr_handle, ompd_scope_address_space,
19 /* ompd_icv_num_procs_var: check enum ompd_icv in omp-icv.cpp */,
&icv_value);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// ompd_rc_bad_input if an unknown value is provided in icv_id.
printf("Test: bad_input for unknown icv_id.\n");
rc = ompd_get_icv_from_scope(addr_handle, ompd_scope_address_space,
99 /*wrong value*/, &icv_value);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
// ompd_rc_incompatible if the ICV cannot be represented as an integer;
printf("Test: rc_incompatible for ICV that cant be represented as an "
"integer.\n");
rc = ompd_get_icv_from_scope(addr_handle, ompd_scope_address_space,
12 /*ompd_icv_tool_libraries_var*/, &icv_value);
if (rc != ompd_rc_incompatible)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL icv_value.\n");
rc = ompd_get_icv_from_scope(addr_handle, ompd_scope_address_space,
19 /*ompd_icv_num_procs_var*/, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error for NULL handle.\n");
rc = ompd_get_icv_from_scope(NULL, ompd_scope_address_space,
19 /*ompd_icv_num_procs_var*/, &icv_value);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
PyObject *test_ompd_get_icv_from_scope_with_thread_handle(PyObject *self,
PyObject *args) {
printf("Testing \"ompd_get_icv_from_scope with thread_handle\"...\n");
PyObject *threadHandlePy = PyTuple_GetItem(args, 0);
ompd_thread_handle_t *thread_handle =
(ompd_thread_handle_t *)(PyCapsule_GetPointer(threadHandlePy,
"ThreadHandle"));
ompd_word_t icv_value;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_icv_from_scope(
thread_handle, ompd_scope_thread,
22 /* ompd_icv_thread_num_var check enum ompd_icv in omp-icv.cpp */,
&icv_value);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
printf("Test: with nthreads_var for ompd_rc_incomplete.\n");
rc = ompd_get_icv_from_scope(thread_handle, ompd_scope_thread,
7 /*ompd_icv_nthreads_var*/, &icv_value);
if (rc != ompd_rc_incomplete) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
return Py_None;
}
PyObject *test_ompd_get_icv_from_scope_with_parallel_handle(PyObject *self,
PyObject *args) {
printf("Testing \"ompd_get_icv_from_scope with parallel_handle\"...\n");
PyObject *parallelHandlePy = PyTuple_GetItem(args, 0);
ompd_parallel_handle_t *parallel_handle =
(ompd_parallel_handle_t *)(PyCapsule_GetPointer(parallelHandlePy,
"ParallelHandle"));
ompd_word_t icv_value;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_icv_from_scope(
parallel_handle, ompd_scope_parallel,
15 /*ompd_icv_active_levels_var:check enum ompd_icv in omp-icv.cpp */,
&icv_value);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
return Py_None;
}
PyObject *test_ompd_get_icv_from_scope_with_task_handle(PyObject *self,
PyObject *args) {
printf("Testing \"ompd_get_icv_from_scope with task_handle\"...\n");
PyObject *taskHandlePy = PyTuple_GetItem(args, 0);
ompd_task_handle_t *task_handle =
(ompd_task_handle_t *)(PyCapsule_GetPointer(taskHandlePy, "TaskHandle"));
ompd_word_t icv_value;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_icv_from_scope(
task_handle, ompd_scope_task,
16 /*ompd_icv_thread_limit_var: check enum ompd_icv in omp-icv.cpp */,
&icv_value);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
return Py_None;
}
/*
Test API: ompd_get_icv_string_from_scope
Program:
1. #include <stdio.h>
2. #include <omp.h>
3. int main () {
4. omp_set_num_threads(4);
5. #pragma omp parallel
6. {
7. printf("Parallel level 1, thread num = %d",
omp_get_thread_num());
8. }
9. return 0;
10. }
GDB Commands:
ompd init
b 7
c
ompdtestapi ompd_get_icv_string_from_scope
*/
PyObject *test_ompd_get_icv_string_from_scope(PyObject *self, PyObject *args) {
printf("Testing \"ompd_get_icv_string_from_scope\"...\n");
PyObject *addrSpaceTup = PyTuple_GetItem(args, 0);
ompd_address_space_handle_t *addr_handle =
(ompd_address_space_handle_t *)PyCapsule_GetPointer(addrSpaceTup,
"AddressSpace");
const char *icv_string;
printf("Test: With Correct Arguments.\n");
ompd_rc_t rc = ompd_get_icv_string_from_scope(
addr_handle, ompd_scope_address_space,
12 /*ompd_icv_tool_libraries_var: check enum ompd_icv in omp-icv.cpp */,
&icv_string);
if (rc != ompd_rc_ok) {
printf("Failed. with return code = %d\n", rc);
return Py_None;
} else
printf("Success.\n");
// ompd_rc_bad_input if an unknown value is provided in icv_id.
printf("Test: bad_input for unknown icv_id.\n");
rc = ompd_get_icv_string_from_scope(addr_handle, ompd_scope_address_space,
99 /*wrong value*/, &icv_string);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
// Random checks with null and invalid args.
/*
ompd_rc_stale_handle: is returned when the specified handle is no
longer valid;
ompd_rc_bad_input: is returned when the input parameters
(other than handle) are invalid;
ompd_rc_error: is returned when a fatal error occurred;
*/
printf("Test: Expecting ompd_rc_bad_input for NULL icv_string.\n");
rc = ompd_get_icv_string_from_scope(addr_handle, ompd_scope_address_space,
12 /*ompd_icv_tool_libraries_var*/, NULL);
if (rc != ompd_rc_bad_input)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
printf("Test: Expecting ompd_rc_error for NULL handle.\n");
rc = ompd_get_icv_string_from_scope(NULL, ompd_scope_address_space,
12 /*ompd_icv_tool_libraries_var*/,
&icv_string);
if (rc != ompd_rc_error && rc != ompd_rc_stale_handle)
printf("Failed. with return code = %d\n", rc);
else
printf("Success.\n");
return Py_None;
}
PyObject *test_ompd_get_tool_data(PyObject *self, PyObject *args) {
printf("Disabled: Testing Not enabled for \"ompd_get_tool_data\".\n");
return Py_None;
}
PyObject *test_ompd_enumerate_states(PyObject *self, PyObject *args) {
printf("Disabled: Testing Not enabled for \"ompd_enumerate_states\".\n");
return Py_None;
}