编译配置在makefile.rule里,在较新的机器上,首先要设置target和位宽,比如:
TARGET=NEHALEM
BINARY=64
然后,multi-threaded版本与openmp使用有潜在冲突:
1. 首先,必须禁用gotoblas2的cpu affinity选项,即设置
NO_AFFINIY = 1
否则,编译出的libgoto2,能在多核上并行运行,但是导致程序中其余使用openmp的并行段串行执行。实际的原因,是libgoto2运行时,重设了cpu affinity,影响其他openmp的线程全部绑定到一个cpu core上。
2. 多线程的libgoto2,不能开启GOMP_CPU_AFFINIY之类的环境变量。
否则,libgoto2只能串行运行。即外部设置的cpu affinity同样影响gotoblas的线程,而且是负面的影响。
即使这样做,gotoblas和openmp可以同时正常工作,由于禁用了gotoblas的cpu affinity,gotoblas的性能相比设置这个选项,有20%以上的损失。可以说,这一块gotoblas的实现不友好,网上有直接把这个作为bug上报的。
目前推荐的做法:
设置 USE_THREAD = 0,强制关闭多线程,编译单线程gotoblas版本。然后在自己的应用程序中,按合适的方法划分负载,做并行化,调用gotoblas的kernel运算。目前看,这样做的性能和灵活性都有较大的优势。
TARGET=NEHALEM
BINARY=64
然后,multi-threaded版本与openmp使用有潜在冲突:
1. 首先,必须禁用gotoblas2的cpu affinity选项,即设置
NO_AFFINIY = 1
否则,编译出的libgoto2,能在多核上并行运行,但是导致程序中其余使用openmp的并行段串行执行。实际的原因,是libgoto2运行时,重设了cpu affinity,影响其他openmp的线程全部绑定到一个cpu core上。
2. 多线程的libgoto2,不能开启GOMP_CPU_AFFINIY之类的环境变量。
否则,libgoto2只能串行运行。即外部设置的cpu affinity同样影响gotoblas的线程,而且是负面的影响。
即使这样做,gotoblas和openmp可以同时正常工作,由于禁用了gotoblas的cpu affinity,gotoblas的性能相比设置这个选项,有20%以上的损失。可以说,这一块gotoblas的实现不友好,网上有直接把这个作为bug上报的。
目前推荐的做法:
设置 USE_THREAD = 0,强制关闭多线程,编译单线程gotoblas版本。然后在自己的应用程序中,按合适的方法划分负载,做并行化,调用gotoblas的kernel运算。目前看,这样做的性能和灵活性都有较大的优势。