- 博客(7)
- 收藏
- 关注
原创 多线程安全的单例模式
使用静态函数变量是实现线程安全单例模式的简洁且有效的方式,特别是在 C++11 及更高版本中,它避免了使用锁定机制的复杂性,同时确保了初始化的线程安全性。因此,这种方法是一种推荐的实现方式。
2024-08-29 09:29:41
140
原创 va_list解决可变参数的传入问题
首先,我们需要定义一个简单的Tensor类,这个类包含张量的数据类型、设备类型以及各维度大小。public:private:我们需要编写一个函数,用于检查张量的维度、设备类型和数据类型是否符合要求。这个函数使用可变参数来传递期望的维度。++i) {
2024-08-25 18:47:42
130
原创 load_dataset能一次性导入train, val, test
再数据导入后,可以使用get来进行获得对于对应key的value,即对应的dataset,然后再使用map函数来进行后续的数据处理,不同的数据集,例如train,val用不同的 map中指定的函数来进行数据处理。
2024-08-17 20:07:32
179
转载 怎么XXX.sh后再debug torchrun 以及 deepspeed,如何追进transformers库里面
一般情况下,大家都是使用deepspeed、torchrun运行代码。参数都特别多,然后都是使用。🚨 上面的端口号都写一样。
2024-08-13 22:12:01
55
原创 cuda xy使用不当会导致速率下降
抛出一个问题,按照我写c++的习惯,一般是x对于的行号,y对于的列号,例如一个数组arr[x][y]这样去访问主存。一维数组映射则是arr[x*ny+y]这样,保证是y是连续读或写即可,数组一般是行主序。考虑到CUDA中的线程是按照warp(即线程束)的粒度来执行的。因此当线程块中的线程按照x维度连续访问内存(例如数组中的连续元素)时,这些访问可以被GPU硬件自动合并,从而使内存访问更加高效。所以这样访存arr[y*nx + x]更高效。上述代码在的,的,不能合并写操作,读是可以合并的。
2024-08-13 15:56:55
796
原创 placement new VS new
因为分离了内存分配和对象构造,你必须手动管理这两个过程。构造对象后,必须手动调用析构函数来销毁对象,然后手动释放内存。普通的new和delete是一气呵成的,则要求你分开进行这两步操作。
2024-08-12 16:00:10
224
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人