不会吧,不会吧,都AI大模型时代了,还有人不会写CUDA?
多处理器以一组 32 个并行线程(称为 warp)为单位创建、管理、调度和执行线程。组成一个线程的各个线程从相同的程序地址开始,但它们有自己的指令地址计数器和寄存器状态,因此可以自由分支和独立执行。(CUDA C++ Programming Guide Release 12.2)
函数定义如下:
在本题中,我们可以简单将warp理解为一个长为 $$$32$$$ 的数组 $$$a[0],\cdots,a[31]$$$,这些指令可以快速地对指定的下标集合进行「数据传输」。
$$$\text{mask}$$$ 用于确定参与数据传输的下标集合 $$$o$$$。设 $$$f(x)$$$ 为 $$$x$$$ 二进制表示中所有为 $$$1$$$ 的位的集合,如果 $$$f(\text{mask})\subseteq f(p)$$$,那么下标 $$$p$$$ 将参与此次的数据传输。
例如若 $$$\text{mask}=(10)_{10}=(01010)_2$$$,则 $$$f(10)=\{1,3\}$$$。$$$(8)_{10}=(01000)_2,f(8)=\{3\}$$$,则 $$$8$$$ 不符合条件;而 $$$(31)_{10}=(11111)_2,f(31)=\{0,1,2,3,4\}$$$,则 $$$31$$$ 符合条件。
$$$\text{delta}$$$ 和函数名共同确定传输的所有「下标对」。例如对于 __shfl_up_sync来说,对于任意下标 $$$x\in o$$$,若存在下标 $$$y$$$ 满足 $$$y\in o$$$ 且 $$$y=x-\text{delta}$$$,则将 $$$a[x]$$$ 传输到 $$$a[y]$$$,记为 $$$x\to y$$$。若不存在这样的 $$$y$$$,则无事发生。
注意:每次数据传输对于所有下标来说是同时发生的,没有先后次序。因此若存在 $$$z\to y,y\to x$$$,则 $$$a[y]$$$ 接收到的是数据传输前的 $$$a[z]$$$,同理 $$$a[x]$$$ 接收到的是数据传输前的 $$$a[y]$$$。
在本题中,「数据传输」有以下三种方式:
你的任务就是模拟这些指令,得到最终的warp。
提示:所谓异或,即按二进制逐位异或。异或的规则为:$$$1 \oplus 1=0,0 \oplus 0=0,1 \oplus 0=1,0 \oplus 1=1$$$,例如$$$(001)_2\oplus(101)_2=(100)_2$$$,即$$$(1)_{10}\oplus (5)_{10}=(4)_{10}$$$。
第一行一个正整数 $$$T(1\leq T\leq 1000)$$$,表示数据组数。
接下来 $$$T$$$ 组数据,对于每组数据:
第一行一个正整数 $$$n(1\leq n\leq 10)$$$,表示操作数。
第二行 $$$32$$$ 个整数 $$$a_0,a_1,\cdots,a_{31}(0\leq a_i\leq 31)$$$,表示warp的初值。
接下来 $$$n$$$ 行,每行 $$$3$$$ 个整数 $$$\text{op}(0\leq \text{op}\leq 2), \text{mask}(0\leq \text{mask}\leq 31), \text{delta}(0\leq \text{delta}\leq 31)$$$,$$$\text{op}$$$ 表示该操作是哪个函数,$$$\text{mask}$$$ 和 $$$\text{delta}$$$ 的含义如上文所示。
一共 $$$T$$$ 行,每行一个整数,表示所有操作结束后,$$$a_0\oplus a_1\oplus\cdots\oplus a_{31}$$$ 的值,$$$\oplus$$$ 为按位异或(BITWISE-XOR),即整个warp的异或和。
150 3 19 21 0 29 0 30 24 25 0 6 5 1 15 8 6 3 17 4 31 14 10 27 25 25 6 22 0 29 18 310 22 01 25 51 29 232 1 292 1 12
38
对于给出的样例:
第1次操作为__shfl_up_add(22,0)。mask的二进制表示为 $$$(22)_{10}=(10110)_2$$$, 符合条件的下标为:$$$(22)_{10}=(10110)_2$$$,$$$(23)_{10}=(10111)_2$$$,$$$(30)_{10}=(11110)_2$$$,$$$(31)_{10}=(11111)_2$$$,因此数据传输情况如下:
第2次操作为__shfl_down_add(25,5)。mask的二进制表示为$$$(25)_{10}=(11001)_2$$$, 符合条件的下标为:$$$(25)_{10}=(11001)_2$$$,$$$(27)_{10}=(11011)_2$$$,$$$(29)_{10}=(11101)_2$$$,$$$(31)_{10}=(11111)_2$$$,但无同时满足条件的下标对。
第3次操作为__shfl_down_add(29,23)。mask的二进制表示为$$$(29)_{10}=(11101)_2$$$, 符合条件的下标为:$$$(29)_{10}=(11101)_2$$$,$$$(31)_{10}=(11111)_2$$$,但无同时满足条件的下标对。
第4,5次操作以此类推。
最终的warp为:0, 4, 19, 29, 0, 54, 0, 36, 24, 54, 0, 36, 5, 4, 15, 29, 6, 32, 17, 66, 31, 39, 20, 76, 25, 39, 6, 76, 0, 32, 36, 66,异或和为38。
| Название |
|---|


