2024.8.25 ~ 9.3 东京圈夏日生活
あぁ! 夏を今もう一回
いまが最高!
时间追溯到几个月前,之前就一直想去一次ASL现场,没去上23年的觉得还是有点可惜的,所以就在想今年跑一趟。公布阵容的时候发现 day3 的阵容很想看:闹闹,TRUE老师,minori,ReoNa ,爱喵,asaka,还有南球和 fripside。所以拜托马哥帮忙搞票。后来又追加了北宇治和B小町,阵容就更加无敌了。
あぁ! 夏を今もう一回
いまが最高!
时间追溯到几个月前,之前就一直想去一次ASL现场,没去上23年的觉得还是有点可惜的,所以就在想今年跑一趟。公布阵容的时候发现 day3 的阵容很想看:闹闹,TRUE老师,minori,ReoNa ,爱喵,asaka,还有南球和 fripside。所以拜托马哥帮忙搞票。后来又追加了北宇治和B小町,阵容就更加无敌了。
放着女武神final的live 写这一篇游记,女武神真的是神企划,五位都太会唱了,以后会不会再遇到这样的企划了呢?也珍惜跑live的机会吧
这次时隔五年赴日,主要是去看三场 event :
auto:for(auto& name : input){}
c++中name mingling较C更为复杂
创建静态链接库
gcc -fPIC -c a.c
gcc -fPIC -c b.c
gcc -shared -o libfoo.so a.o b.o
Kokkos 是 C++ library
hierarchy : device
, host-parallel
, host-serial
同步:Kokkos::fence()
两个问题:
DualView : 维护在 device memory 上的 Kokkos::View
和其在 host memory 上的 Kokkos::View
mirror,同时维护在两个不同 memory space 的 data
DataType
, Layout
, Device
using view_type = Kokkos::DualView<Scalar**, Kokkos::LayoutLeft, Device>
scatter-add
:两个粒子共享邻居,当两个粒子同时更新邻居时可能造成 race
使用 data replication V.S. 使用 atomic operation 解决 race 问题ScatterView
: 在编译时透明地选择处理原子操作方法,对于 CPU 使用 data replication,对于 GPU 使用 atomic operation
`Kokkos::Experimental::contribute(View &dest, Kokkos::Experimental::ScatterView
const &src) 将 ScatterView 的 reduction 结果放回到 dest,可能在
Kokkos::parallel_reduce()` 后调用
判断 layout :
if (std::is_same<typename decltype(fpair->f)::traits::array_layout, Kokkos::LayoutLeft>::value) {
printf("array fpair->f is LayoutLeft\n");
}
if (std::is_same<typename decltype(fpair->f)::traits::array_layout, Kokkos::LayoutRight>::value) {
printf("array fpair->f is LayoutRight\n");
}
获取 stride :
int strides[2];
(fpair->x).stride(strides);
printf("array fpair->x stride : (%d, %d)\n", strides[0], strides[1]);
RandomAccess
: Kokkos::MemoryTraits<Kokkos::RandomAccess>
,当在 Cuda
execution space 中执行时, 如果对于在 CudaSpace
或 CudaUVMSpace
中的 const View,Kokkos 会使用 texture fetch 访问
Unmanaged View
: Kokkos::MemoryTraits<Kokkos::Unmanaged>
, 对于一个 raw pointer, Kokkos 不进行 reference counting 和 deallocation
CPU 结构:
threads per core : 超线程
cores per socket : 每个 socket 核数
sockets
每个 mpi 进程有 affinity mask,长度为 CPU cores--bind-to core
: affinity mask 中只有对应 core 一位被 set--bind-to socket
: affinity mask 中 socket 对应 所有 core 被 set--bind-to none
--map-by node
--map-by socket
--map-by node:PE=8
: PE为每个进程分配的物理核数
hostfile :
i1 slots=2 max-slots=8
i2 slots=2 max-slots=8
`which mpirun` -np 2 --host i1:1,i2:1 hostname
`which mpirun` -np 4 --hostfile ./hostfile hostname
使用脚本时开头要加 #!/bin/bash
OMP_DISPLAY_ENV=true
输出 OMP 绑定情况OMP_PLACES=threads
, OMP_PLACES=cores
, OMP_PLACES=sockets
hyperthread cpu 分布:/sys/devices/system/cpu/cpu0/topology$ cat thread_siblings_list
#include <omp.h>
#include <sched.h>
#pragma omp parallel
{
int id = omp_get_thread_num();
int max_threads = omp_get_num_threads();
int cpuid = sched_getcpu();
printf("hello from cpu: %d thread: %d out of %d threads @ rank = %d\n", cpuid, id, max_threads, rank);
}