File I/O for Game Developers: Past, Present, and FutureFILE I/O: PAST, PRESENT AND FUTURE CPPCON OCTOBER 3RD 2023 GUY DAVIDSON @HATCAT01INTRODUCTIONS • Head of Engineering Practice at Creative Assembly • 1980 – Acorn Atom • ISO/IEC JTC1/SC22/WG21 • BSI RAM, MORE DISK CAPACITY • Formatted i/o – scanf printf • Direct i/o – fread fwrite • File positioning – ftell fgetpos fseek fsetpos rewind • Unformatted i/o – fgetc/fgets fputc/fputs getchar putchar interface Secondary interfaceTHE 64-BIT ADDRESS SPACE • https://wg21.link/p1040 • “I’m very keen on std::embed. I’ve been hand-embedding data in executables for NEARLY FORTY YEARS now. — Guy "Hatcat"0 码力 | 64 页 | 2.69 MB | 6 月前3
Concurrency Patterns I0 码力 | 39 页 | 1.14 MB | 6 月前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅存储大规模三维数据的关键:稀疏数据结构 11.物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 64 位( 32 位时代过去了) 至少 2 核 4 线程(并行课…) 英伟达家显卡( GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户) GCC • 运用多线程的方式和动机,一般分为两种。 • 并发:单核处理器,操作系统通过时间片调 度算法,轮换着执行着不同的线程,看起来 就好像是同时运行一样,其实每一时刻只有 一个线程在运行。目的:异步地处理多个不 同的任务,避免同步造成的阻塞。 • 并行:多核处理器,每个处理器执行一个线 程,真正的同时运行。目的:将一个任务分 派到多个核上,从而更快完成任务。 举个例子 • 并发:某互联网公司购置了一台单核处理 最后只需将 4 个小块拼接起来即可得到完整 的 cornell box 图像。总共只花了 1 分钟。 图形学爱好者:我看中的是多核,目的是加速比,如果是单核,那多线程对我无用! 某互联网公司:我看中的是异步,目的是无阻塞,即使是单核,多线程对我也有用。 因特尔开源的并行编程库: TBB https://link.springer.com/chapter/10.1007%2F978-1-4842-4398-5_20 码力 | 116 页 | 15.85 MB | 1 年前3
现代C++ 教程:高速上手C++11/14/17/20gcc 编译 C 语言的代码: gcc -c foo.c 编译出 foo.o 文件,再使用 clang++ 将 C++ 代码和 .o 文件链接起来(或者都编译为 .o 再统一 链接): 10 进一步阅读的参考文献 第 1 章迈向现代 C++ clang++ 1.1.cpp foo.o -std=c++2a -o 1.1 当然,你可以使用 Makefile 来编译上面的代码: C = gcc OBJECTS_C = foo.o SOURCE_CXX = 1.1.cpp TARGET = 1.1 LDFLAGS_COMMON = -std=c++2a all: $(C) -c $(SOURCE_C) $(CXX) $(SOURCE_CXX) $(OBJECTS_C) $(LDFLAGS_COMMON) -o $(TARGET) clean: rm -rf *.o $(TARGET) return 0; } void foo(char *) { std::cout << "foo(char*) is called" << std::endl; } void foo(int i) { std::cout << "foo(int) is called" << std::endl; } 将输出: foo(int) is called foo(char*) is called0 码力 | 83 页 | 2.42 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程如何从核函数里返回数据? • 我们试着把 kernel 的返回类型声明为 int ,试 图从 GPU 返回数据到 CPU 。 • 但发现这样做会在编译期出错,为什么? • 刚刚说了 kernel 的调用是异步的,返回的时候 ,并不会实际让 GPU 把核函数执行完毕,必须 cudaDeviceSynchronize() 等待他执行完毕(和 线程的 join 很像)。所以,不可能从 kernel 里 地址。然后把 arr 指针传入 kernel ,即 可在里面用 arr[i] 访问他的第 i 个元素。 • 然后因为我们用的统一内存 (managed) , 所以同步以后 CPU 也可以直接读取。 多个线程,并行地给数组赋值 • 刚刚的 for 循环是串行的,我们可以把线 程数量调为 n ,然后用 threadIdx.x 作为 i 索引。这样就实现了,每个线程负责给数 组中一个元素的赋值。 - 1) / nthreads • 例如: (7 + 3) / 4 = 2 , (8 + 3 / 4) = 2 。 • 由于向上取整,这样会多出来一些线程, 因此要在 kernel 内判断当前 i 是否超过 了 n ,如果超过就要提前退出,防止越界 。 网格跨步循环:应用于线程和板块一起上的情况 • 网格跨步循环实际上本来是这样,利用扁平 化的线程数量和线程编号实现动态大小。 • 同样,无论调用者指定每个板块多少线程0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程存储大规模三维数据的关键:稀疏数据结构 11.物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 64 位( 32 位时代过去了) 至少 2 核 4 线程(并行课…) 英伟达家显卡( GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户) GCC 发生了错误。 • 原来 std::thread 的实现背后是基于 pthread 的。 • 解决: CMakeLists.txt 里链接 Threads::Threads 即可: 有了多线程:异步处理请求 • 有了多线程的话,文件下载和用户交互分 别在两个线程,同时独立运行。从而下载 过程中也可以响应用户请求,提升了体验 。 • 可是发现一个问题:我输入完 pyb 以后, 他的确及时地和我交互了。但是用户交互 std::jthread 类,和 std::thread 不同在于:他的解构函数里会 自动调用 join() 函数,从而保证 pool 解 构时会自动等待全部线程执行完毕。 小彭老师快乐吐槽时间 • 多线程、异步、无阻塞、并发,能提升程序响应速度,对现实世界中的软件工程至关重要 。 • 反面教材: blender 在运行物理解算的时候,界面会卡住,算完一帧后窗口才能刷新一遍 ,导致解算过程中基本别想做事,这一定程度上归功于0 码力 | 79 页 | 14.11 MB | 1 年前3
Adventures in SIMD Thinking (Part 2 of 2)Steagall CppCon 2020 K E W B C O M P U T I N GCopyright © 2020 Bob Steagall K E W B C O M P U T I N G Agenda • Learn a little about Intel's SIMD facilities (disclaimer: I don't work for Intel) • Create Convolution 3 CppCon 2020 - Adventures in SIMD ThinkingCopyright © 2020 Bob Steagall K E W B C O M P U T I N G Convolution • f is a signal • g is a kernel • Output f*g is the convolution • Every point de-noising CppCon 2020 - Adventures in SIMD Thinking 4Copyright © 2020 Bob Steagall K E W B C O M P U T I N G Convolution CppCon 2020 - Adventures in SIMD Thinking 5 S = s0 s1 s2 s30 码力 | 135 页 | 551.08 KB | 6 月前3
Adventures in SIMD Thinking (Part 1 of 2)Steagall CppCon 2020 K E W B C O M P U T I N GCopyright © 2020 Bob Steagall K E W B C O M P U T I N G Agenda • Learn a little about Intel's SIMD facilities (disclaimer: I don't work for Intel) • Create "vertically" CppCon 2020 - Adventures in SIMD Thinking 2Copyright © 2020 Bob Steagall K E W B C O M P U T I N G 3 CppCon 2020 - Adventures in SIMD Thinking Getting Started #include#include namespace simd { using rf_512 = __m512; using ri_512 = __m512i; using msk_512 = uint32_t; ... }Copyright © 2020 Bob Steagall K E W B C O M P U T I N G 4 CppCon 2020 - Adventures in SIMD Thinking Function 0 码力 | 88 页 | 824.07 KB | 6 月前3
Back to Basics: The Abstract Machineto Basics: The Abstract Machine Bob Steagall CppCon 2020 K E W B C O M P U T I N GCopyright © 2020 Bob Steagall K E W B C O M P U T I N G Overview/Goals • Describe abstract machines in general • Describe abstract machine CppCon 2020 - The Abstract Machine 2Copyright © 2020 Bob Steagall K E W B C O M P U T I N G What is an Abstract Machine? “Abstract machines are machines because they permit step-by-step Systems 16 (2000) CppCon 2020 - The Abstract Machine 3Copyright © 2020 Bob Steagall K E W B C O M P U T I N G What is an Abstract Machine? “Programming language specifications (not just C and C++, all0 码力 | 91 页 | 538.90 KB | 6 月前3
Performance Mattersflush_icache(void* begin, size_t size) { uintptr_t p = (uintptr_t)begin & ~15UL; for (size_t i = 0; i < size; i += 16) { asm("icbi 0,%0" : : "r"(p)); p += 16; } asm("isync"); meaning_of_life=42; for (size_t i = 0; i < size; i += 32) { asm("icbi 0,%0" : : "r"(p)); p += 32; } for (size_t i = 16; i < size; i += 32) { asm("icbi 0,%0" : : meaning_of_life=42; for (size_t i = 0; i < size; i += 32) { asm("icbi 0,%0" : : "r"(p)); p += 32; } for (size_t i = 16; i < size; i += 32) { asm("icbi 0,%0" : :0 码力 | 197 页 | 11.90 MB | 6 月前3
共 392 条
- 1
- 2
- 3
- 4
- 5
- 6
- 40













