C rodinia 3.1心肌细胞中的奇怪结构

C rodinia 3.1心肌细胞中的奇怪结构,c,parallel-processing,openmp,benchmarking,pragma,C,Parallel Processing,Openmp,Benchmarking,Pragma,我目前正在研究概念性的RISCV SIMT体系结构,我们的模拟器只模拟一些需要的库调用。我们正在尝试运行openmp基准测试,但由于我们只有pthread支持,我正在尝试将简单的静态调度openmp代码转换为pthread代码 我在myocyte基准测试中发现了这种结构: // master.c void master(params) { // declaration of th_id int th_id; // no initialization of th_id

我目前正在研究概念性的RISCV SIMT体系结构,我们的模拟器只模拟一些需要的库调用。我们正在尝试运行
openmp
基准测试,但由于我们只有
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);
}
//master.c
无效主控(参数){
//身份证声明
int th_id;
//没有初始化THU id
#pragma omp并行专用(th_id)
{
//使用THU id作为“线程id”值的代码
}
}
//main.c
#pragma-omp并行

对于(i=0;i而言,此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基准。

它是否使用
th\u id
的值或地址作为线程id?AFAIK
private(th\u id)
为每个线程构造单独的
th\u id
变量,但它不应该真正用任何东西初始化它。除非OpenMP设置为使用嵌套并行,否则在外部区域中打开另一个
parallel
区域没有任何好处。这使得这个构造在解决(缺少)问题之前已经非常奇怪了初始化
th\u id
…我刚刚下载并检查了代码,确实,这里有一个bug,使用了
th\u id
,但从未设置。实际上,gcc捕获到它时带有警告
master。c:66:7:警告:“th\u id”在这个函数中未初始化使用[-Wuninitialized]
是的,gcc会捕获未初始化的错误,并且
th\u id
用于区分作业(线程1到N执行某些操作,线程N+1到M执行其他操作…),所以我的问题是:openmp中是否有未记录的更改程序并使其正确的内容,或者此代码是否错误?编译的二进制文件似乎不正确,因为存在对“团队创建”的嵌套调用openmp的原语。谢谢你的回答,如果你认为这是一个bug,我会在我的实现中首先尝试修复它。不,标准中没有任何东西可以神奇地更正代码。它甚至在
private
指令中都会出现双重错误,如果发生这种情况,它将丢失初始化(有人会想要一个
firstprivate
。哦,没有看到越界。是的,OMP端口做得很差,不仅是为了这个平台。但是这个平台列表对我们来说非常有趣,因为它包含发散/统一的高度并行计算。谢谢你的回答:)@Shumush,的确,Rodinia是一个著名的异构计算系统基准套件。有趣的是,2.4版的自述文件上写着“4”。纠正了myocyte OpenMP版本的许多错误。”:)