【问题标题】:Openmp parallel for loop syntax in linux C with pthreads带有pthreads的Linux C中的Openmp并行for循环语法
【发布时间】:2017-11-21 08:52:07
【问题描述】:

我用openmp完成了下面的代码,但是函数

nvme_identify(fd, 0, 1, data);      

依次调用 ioctl(),它是 nvme 的阻塞系统调用。因此,为了获得真正的并行性,我希望拥有与 pthread 相同的代码。

我是 pthreads 的新手,所以任何人都可以为我提供以下 openmp 代码的 pthreads 语法吗?

#pragma omp parallel for num_threads(5)
for(i=0; i<rc; i++){
      err = nvme_identify(fd, 0, 1, data);
}

【问题讨论】:

    标签: c multithreading pthreads openmp systems-programming


    【解决方案1】:

    Pthreads 不像 OpenMP 有点像手动操作。 作为伪代码,您可以尝试这样的操作:

    main()

    为要在nvme_identify(fd, 0, 1, data)中使用的参数创建一个结构体
    假设my_struct[NUM_OF_THREADS]
    NUM_OF_THREADS 是(正如你猜测的那样)你将产生的线程数。

    正确填写参数,即:
    my_struct[0].fd = fd
    my_struct[0].data = data
    ...

    使用 for 循环创建 pthread,例如:

    for (i=0; i < NUM_OF_THREADS; i++) pthreads_create(...., MyThreadedFunction, (void*)&my_struct[i]);

    MyThreadedFunction(void *val) 恢复这样的参数:
    struct my_struct_tag *my_struct = (struct my_struct_tag *)val;
    int fd = my_struct-&gt;fd
    ...
    并致电err = nvme_identify(fd, 0, 1, data)

    正确调整参数以获得最大并行度。
    在 main 中,您需要使用 pthread_join 来等待所有线程完成。

    在我的逻辑中可能会出现错误。这是一个快速的答案。 希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      相关资源
      最近更新 更多