我目前正在研究概念性RISCV SIMT体系结构,我们的模拟器仅模拟一些所需的库调用。我们正在尝试运行openmp
rodinia 3.1基准,但由于我们仅支持pthread
,因此我试图将简单的静态调度的openmp
代码转换为pthread
代码。
我在myocyte
基准中发现了这种构造:
// master.c
void master(params) {
// declaration of th_id
int th_id;
// no initialization of th_id
#pragma omp parallel private(th_id)
{
// code that uses th_id as a "thread id" value
}
}
// main.c
#pragma omp parallel for
for (i=0; i<N; i++) {
master(params);
}
据我所知,开发人员依靠#pragma
代码中的master.c
来初始化变量th_id
,但我找不到openmp文档中的声明。假设th_id
被ompenmp识别并初始化是完全正确还是错误?
此OpenMP基准代码已完全损坏。在并行区域的开头应该有这样的内容:
th_id = omp_get_thread_num();
[它获得调用线程的ID,并且它是一个介于0和执行并行区域的线程数之间的数字减去1,其中0对应于主线程。
同样,此代码确实被破坏,似乎已经从Fortran进行了翻译。有一个越界数组访问:
int th_count[4];
...
#pragma omp parallel private(th_id)
{
...
if (th_id == th_count[4]) {
...
}
我想您应该简单地废弃Myocyte基准。