我对在 Microblaze 处理器上运行的 OpenMP 实现“GOMP”(即 GNU OpenMP)有疑问。MicroBlaze 处理器位于内核主线中,赛灵思为其提供了 pthread 实现。所以我从 pthread 实现开始交叉编译了 GOMP 库,并插入到运行在 Microblaze 上的 Linux 内核中(即 3.10 版本,名为 Petalinux)。具体来说,运行 Parsec 基准测试之一(这里是链接(http://parsec.cs.princeton.edu/download.htm)),即 blackscholes,突出显示了问题。显示问题的代码部分如下:
int bs_thread(void *tid_ptr) {
int i, j;
fptype price;
fptype priceDelta;
int tid = *(int *)tid_ptr;
for (j=0; j<NUM_RUNS; j++) {
#pragma omp parallel for private(i, price, priceDelta)
for (i=0; i<numOptions; i++) {
price = BlkSchlsEqEuroNoDiv( sptprice[i], strike[i],rate[i], volatility[i], otime[i], otype[i], 0);
prices[i] = price;
}
}
return 0;
}
blackscholes 可以使用不同的输入集和不同的线程号启动,使用以下命令: blackscholes _num_threads_ _input_file_ _output_file_
使用 1、2、3、5、7 线程等启动它,遵循奇数,效果很好。使用 4、6、8、10 线程等启动它,在偶数之后,它会阻塞。同样,通过将常数 NUM_RUNS 减少到 1,应用程序运行良好。我的问题是:GOMP 实现是否有可能在 for 循环之后遭受工作共享构造插入(即 omp 并行)?
谢谢你。