我可以使用 openmp 或 pthreads 调用不同线程的相同系统调用吗

阿琼GS

我正在为 nvme-cli 开发一个测试工具(用 c 编写,可以在 linux 上运行)。

我有兴趣使用 't' 线程数重复 nvme 命令 'r' 次数。

下面的代码会重复每个命令以及线程,但这里的问题是与串行执行相比,并行执行时间非常长。

我发现的原因是

err = nvme_identify(fd, 0, 1, data);

依次调用系统调用ioctl();

#pragma omp parallel for num_threads(5)
 for(i=0; i<rc; i++){
          err = nvme_identify(fd, 0, 1, data);
             if (!err) {
                    if (rf->fmt == BINARY)
                            d_raw((unsigned char *)&rf->ctrl, sizeof(rf->ctrl));
                    else if (rf->fmt == JSON)
                            json_nvme_id_ctrl(data, flags, 0);
                    else {
                            printf("NVME Identify Controller:\n");
                            __show_nvme_id_ctrl(data, flags, 0);
                            }
                    }
            else if (err > 0)
                    fprintf(stderr, "NVMe Status:%s(%x)\n",
                            nvme_status_to_string(err), err);
            else
                    perror("identify controller");

那么我能知道如何使用 openmp 或 pthreads 获得真正的并行性吗?

巴西尔·斯塔林克维奇

您当然可以从不同的线程调用系统调用(列在syscalls(2) 中)(否则将无法编写在多个线程上执行 IO 的程序,就像大多数多线程 Web 服务器所做的那样)。

但是,某些ioctl(或其他奇怪的系统调用)可能会阻塞或需要很长时间(几秒或十分之一秒)才能执行。举个很好的例子,弹出一个 CDROM 托盘是由一些人完成的ioctl,它需要一些可见的时间(可能是半秒)来执行(因为它是一些机械动作)。

我猜NVME跟SSD技术有关,有些操作很慢(因为硬件本身很慢)。您的瓶颈可能是硬件本身,那么任何类型的并行化都无济于事。它可能会发生 - 我真的不知道 - 您可能会ioctl在多个线程中使用相同的(在同一个文件描述符上)但内核会序列化其处理。

当内核执行一些阻塞或长时间运行ioctl(或任何其他系统调用)时,它使用其调度程序来运行其他任务(进程或线程)并进行一些锁定然后您的进程处于一种D状态(参见proc(5)和//proc/self/stat/proc/1234/statpid 1234 的进程)并且甚至不处理被推迟的信号(参见signal(7))。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用pthreads和OpenMp在C中并行化Simpson方法

来自分类Dev

使用OpenMP和PThreads的并行程序比顺序程序慢

来自分类Dev

pthreads,如何使用不同的类型?

来自分类Dev

在OpenMP中使用不同的内核运行与使用不同的线程运行不同吗?

来自分类Dev

我可以使用相同的URL,但可以使用不同的动态细分吗?

来自分类Dev

我可以使用多线程一次使相同的rest调用多次吗?

来自分类Dev

Pthreads-我可以从线程中分离然后加入main吗?

来自分类Dev

Pthreads-我可以从线程中分离然后加入main吗?

来自分类Dev

可以在不同线程上调用的类的实例方法使用该类的属性吗?

来自分类Dev

带有 pthreads 的 linux C 中的 Openmp 并行 for 循环语法

来自分类Dev

Ruby线程使用不同的参数调用相同的函数

来自分类Dev

使用pthreads管理链表

来自分类Dev

使用pthreads的分段错误

来自分类Dev

如何使用pthreads在solaris上增加c ++线程堆栈的大小?

来自分类Dev

使用pthreads创建多个线程时出现问题

来自分类Dev

无法使用 pthreads 访问线程类中的 CI 对象

来自分类Dev

我可以使用 onclick 调用 php 函数吗

来自分类Dev

Openmp的减少在我的代码中使用相同数量的线程返回不同的结果

来自分类Dev

我可以使用python CSP吗?

来自分类Dev

我可以使用迭代器吗?

来自分类Dev

我可以使用通配符替换吗

来自分类Dev

我可以使用RTF格式吗?

来自分类Dev

骨骼可以使用我的插件吗?

来自分类Dev

可以在不同的线程上调用相同的方法吗?

来自分类Dev

我可以使用Google Translate使我的Raspberry Pi按需使用不同的语言说吗?

来自分类Dev

可以在Cython中使用OpenMP并行实现此问题吗?

来自分类Dev

如何使用不同的线程通过openmp安全地更新C结构

来自分类Dev

C pthreads:从main启动线程

来自分类Dev

C pthreads:从main启动线程

Related 相关文章

  1. 1

    使用pthreads和OpenMp在C中并行化Simpson方法

  2. 2

    使用OpenMP和PThreads的并行程序比顺序程序慢

  3. 3

    pthreads,如何使用不同的类型?

  4. 4

    在OpenMP中使用不同的内核运行与使用不同的线程运行不同吗?

  5. 5

    我可以使用相同的URL,但可以使用不同的动态细分吗?

  6. 6

    我可以使用多线程一次使相同的rest调用多次吗?

  7. 7

    Pthreads-我可以从线程中分离然后加入main吗?

  8. 8

    Pthreads-我可以从线程中分离然后加入main吗?

  9. 9

    可以在不同线程上调用的类的实例方法使用该类的属性吗?

  10. 10

    带有 pthreads 的 linux C 中的 Openmp 并行 for 循环语法

  11. 11

    Ruby线程使用不同的参数调用相同的函数

  12. 12

    使用pthreads管理链表

  13. 13

    使用pthreads的分段错误

  14. 14

    如何使用pthreads在solaris上增加c ++线程堆栈的大小?

  15. 15

    使用pthreads创建多个线程时出现问题

  16. 16

    无法使用 pthreads 访问线程类中的 CI 对象

  17. 17

    我可以使用 onclick 调用 php 函数吗

  18. 18

    Openmp的减少在我的代码中使用相同数量的线程返回不同的结果

  19. 19

    我可以使用python CSP吗?

  20. 20

    我可以使用迭代器吗?

  21. 21

    我可以使用通配符替换吗

  22. 22

    我可以使用RTF格式吗?

  23. 23

    骨骼可以使用我的插件吗?

  24. 24

    可以在不同的线程上调用相同的方法吗?

  25. 25

    我可以使用Google Translate使我的Raspberry Pi按需使用不同的语言说吗?

  26. 26

    可以在Cython中使用OpenMP并行实现此问题吗?

  27. 27

    如何使用不同的线程通过openmp安全地更新C结构

  28. 28

    C pthreads:从main启动线程

  29. 29

    C pthreads:从main启动线程

热门标签

归档