diff --git a/doc/dev/transpose_access_map.md b/doc/dev/transpose_access_map.md new file mode 100644 index 00000000000..66c61339e8d --- /dev/null +++ b/doc/dev/transpose_access_map.md @@ -0,0 +1,159 @@ +# Transpose 32x32 Access Maps (All Warps Combined) + +Cells show tids (3 digits); empty cells are `...`. + +**Summary** +- No bank conflicts: within each warp, the swizzle permutes lanes so each thread lands on a distinct bank for the shared accesses shown in `write to smem` and `regs (from smem read)`. +- Coalesced gmem: the input and output gmem plots show contiguous columns for each warp group, so global reads/writes are aligned and coalesced. + +## input gmem (read) + +``` + 000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 +000: 000 ... ... ... 001 ... ... ... 002 ... ... ... 003 ... ... ... 004 ... ... ... 005 ... ... ... 006 ... ... ... 007 ... ... ... +001: 008 ... ... ... 009 ... ... ... 010 ... ... ... 011 ... ... ... 012 ... ... ... 013 ... ... ... 014 ... ... ... 015 ... ... ... +002: 016 ... ... ... 017 ... ... ... 018 ... ... ... 019 ... ... ... 020 ... ... ... 021 ... ... ... 022 ... ... ... 023 ... ... ... +003: 024 ... ... ... 025 ... ... ... 026 ... ... ... 027 ... ... ... 028 ... ... ... 029 ... ... ... 030 ... ... ... 031 ... ... ... +004: 033 ... ... ... 032 ... ... ... 035 ... ... ... 034 ... ... ... 037 ... ... ... 036 ... ... ... 039 ... ... ... 038 ... ... ... +005: 041 ... ... ... 040 ... ... ... 043 ... ... ... 042 ... ... ... 045 ... ... ... 044 ... ... ... 047 ... ... ... 046 ... ... ... +006: 049 ... ... ... 048 ... ... ... 051 ... ... ... 050 ... ... ... 053 ... ... ... 052 ... ... ... 055 ... ... ... 054 ... ... ... +007: 057 ... ... ... 056 ... ... ... 059 ... ... ... 058 ... ... ... 061 ... ... ... 060 ... ... ... 063 ... ... ... 062 ... ... ... +008: 066 ... ... ... 067 ... ... ... 064 ... ... ... 065 ... ... ... 070 ... ... ... 071 ... ... ... 068 ... ... ... 069 ... ... ... +009: 074 ... ... ... 075 ... ... ... 072 ... ... ... 073 ... ... ... 078 ... ... ... 079 ... ... ... 076 ... ... ... 077 ... ... ... +010: 082 ... ... ... 083 ... ... ... 080 ... ... ... 081 ... ... ... 086 ... ... ... 087 ... ... ... 084 ... ... ... 085 ... ... ... +011: 090 ... ... ... 091 ... ... ... 088 ... ... ... 089 ... ... ... 094 ... ... ... 095 ... ... ... 092 ... ... ... 093 ... ... ... +012: 099 ... ... ... 098 ... ... ... 097 ... ... ... 096 ... ... ... 103 ... ... ... 102 ... ... ... 101 ... ... ... 100 ... ... ... +013: 107 ... ... ... 106 ... ... ... 105 ... ... ... 104 ... ... ... 111 ... ... ... 110 ... ... ... 109 ... ... ... 108 ... ... ... +014: 115 ... ... ... 114 ... ... ... 113 ... ... ... 112 ... ... ... 119 ... ... ... 118 ... ... ... 117 ... ... ... 116 ... ... ... +015: 123 ... ... ... 122 ... ... ... 121 ... ... ... 120 ... ... ... 127 ... ... ... 126 ... ... ... 125 ... ... ... 124 ... ... ... +016: 004 ... ... ... 005 ... ... ... 006 ... ... ... 007 ... ... ... 000 ... ... ... 001 ... ... ... 002 ... ... ... 003 ... ... ... +017: 012 ... ... ... 013 ... ... ... 014 ... ... ... 015 ... ... ... 008 ... ... ... 009 ... ... ... 010 ... ... ... 011 ... ... ... +018: 020 ... ... ... 021 ... ... ... 022 ... ... ... 023 ... ... ... 016 ... ... ... 017 ... ... ... 018 ... ... ... 019 ... ... ... +019: 028 ... ... ... 029 ... ... ... 030 ... ... ... 031 ... ... ... 024 ... ... ... 025 ... ... ... 026 ... ... ... 027 ... ... ... +020: 037 ... ... ... 036 ... ... ... 039 ... ... ... 038 ... ... ... 033 ... ... ... 032 ... ... ... 035 ... ... ... 034 ... ... ... +021: 045 ... ... ... 044 ... ... ... 047 ... ... ... 046 ... ... ... 041 ... ... ... 040 ... ... ... 043 ... ... ... 042 ... ... ... +022: 053 ... ... ... 052 ... ... ... 055 ... ... ... 054 ... ... ... 049 ... ... ... 048 ... ... ... 051 ... ... ... 050 ... ... ... +023: 061 ... ... ... 060 ... ... ... 063 ... ... ... 062 ... ... ... 057 ... ... ... 056 ... ... ... 059 ... ... ... 058 ... ... ... +024: 070 ... ... ... 071 ... ... ... 068 ... ... ... 069 ... ... ... 066 ... ... ... 067 ... ... ... 064 ... ... ... 065 ... ... ... +025: 078 ... ... ... 079 ... ... ... 076 ... ... ... 077 ... ... ... 074 ... ... ... 075 ... ... ... 072 ... ... ... 073 ... ... ... +026: 086 ... ... ... 087 ... ... ... 084 ... ... ... 085 ... ... ... 082 ... ... ... 083 ... ... ... 080 ... ... ... 081 ... ... ... +027: 094 ... ... ... 095 ... ... ... 092 ... ... ... 093 ... ... ... 090 ... ... ... 091 ... ... ... 088 ... ... ... 089 ... ... ... +028: 103 ... ... ... 102 ... ... ... 101 ... ... ... 100 ... ... ... 099 ... ... ... 098 ... ... ... 097 ... ... ... 096 ... ... ... +029: 111 ... ... ... 110 ... ... ... 109 ... ... ... 108 ... ... ... 107 ... ... ... 106 ... ... ... 105 ... ... ... 104 ... ... ... +030: 119 ... ... ... 118 ... ... ... 117 ... ... ... 116 ... ... ... 115 ... ... ... 114 ... ... ... 113 ... ... ... 112 ... ... ... +031: 127 ... ... ... 126 ... ... ... 125 ... ... ... 124 ... ... ... 123 ... ... ... 122 ... ... ... 121 ... ... ... 120 ... ... ... +``` + +## write to smem + +``` + 000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 +000: 000 ... ... ... 001 ... ... ... 002 ... ... ... 003 ... ... ... 004 ... ... ... 005 ... ... ... 006 ... ... ... 007 ... ... ... +001: 008 ... ... ... 009 ... ... ... 010 ... ... ... 011 ... ... ... 012 ... ... ... 013 ... ... ... 014 ... ... ... 015 ... ... ... +002: 016 ... ... ... 017 ... ... ... 018 ... ... ... 019 ... ... ... 020 ... ... ... 021 ... ... ... 022 ... ... ... 023 ... ... ... +003: 024 ... ... ... 025 ... ... ... 026 ... ... ... 027 ... ... ... 028 ... ... ... 029 ... ... ... 030 ... ... ... 031 ... ... ... +004: 032 ... ... ... 033 ... ... ... 034 ... ... ... 035 ... ... ... 036 ... ... ... 037 ... ... ... 038 ... ... ... 039 ... ... ... +005: 040 ... ... ... 041 ... ... ... 042 ... ... ... 043 ... ... ... 044 ... ... ... 045 ... ... ... 046 ... ... ... 047 ... ... ... +006: 048 ... ... ... 049 ... ... ... 050 ... ... ... 051 ... ... ... 052 ... ... ... 053 ... ... ... 054 ... ... ... 055 ... ... ... +007: 056 ... ... ... 057 ... ... ... 058 ... ... ... 059 ... ... ... 060 ... ... ... 061 ... ... ... 062 ... ... ... 063 ... ... ... +008: 064 ... ... ... 065 ... ... ... 066 ... ... ... 067 ... ... ... 068 ... ... ... 069 ... ... ... 070 ... ... ... 071 ... ... ... +009: 072 ... ... ... 073 ... ... ... 074 ... ... ... 075 ... ... ... 076 ... ... ... 077 ... ... ... 078 ... ... ... 079 ... ... ... +010: 080 ... ... ... 081 ... ... ... 082 ... ... ... 083 ... ... ... 084 ... ... ... 085 ... ... ... 086 ... ... ... 087 ... ... ... +011: 088 ... ... ... 089 ... ... ... 090 ... ... ... 091 ... ... ... 092 ... ... ... 093 ... ... ... 094 ... ... ... 095 ... ... ... +012: 096 ... ... ... 097 ... ... ... 098 ... ... ... 099 ... ... ... 100 ... ... ... 101 ... ... ... 102 ... ... ... 103 ... ... ... +013: 104 ... ... ... 105 ... ... ... 106 ... ... ... 107 ... ... ... 108 ... ... ... 109 ... ... ... 110 ... ... ... 111 ... ... ... +014: 112 ... ... ... 113 ... ... ... 114 ... ... ... 115 ... ... ... 116 ... ... ... 117 ... ... ... 118 ... ... ... 119 ... ... ... +015: 120 ... ... ... 121 ... ... ... 122 ... ... ... 123 ... ... ... 124 ... ... ... 125 ... ... ... 126 ... ... ... 127 ... ... ... +016: 000 ... ... ... 001 ... ... ... 002 ... ... ... 003 ... ... ... 004 ... ... ... 005 ... ... ... 006 ... ... ... 007 ... ... ... +017: 008 ... ... ... 009 ... ... ... 010 ... ... ... 011 ... ... ... 012 ... ... ... 013 ... ... ... 014 ... ... ... 015 ... ... ... +018: 016 ... ... ... 017 ... ... ... 018 ... ... ... 019 ... ... ... 020 ... ... ... 021 ... ... ... 022 ... ... ... 023 ... ... ... +019: 024 ... ... ... 025 ... ... ... 026 ... ... ... 027 ... ... ... 028 ... ... ... 029 ... ... ... 030 ... ... ... 031 ... ... ... +020: 032 ... ... ... 033 ... ... ... 034 ... ... ... 035 ... ... ... 036 ... ... ... 037 ... ... ... 038 ... ... ... 039 ... ... ... +021: 040 ... ... ... 041 ... ... ... 042 ... ... ... 043 ... ... ... 044 ... ... ... 045 ... ... ... 046 ... ... ... 047 ... ... ... +022: 048 ... ... ... 049 ... ... ... 050 ... ... ... 051 ... ... ... 052 ... ... ... 053 ... ... ... 054 ... ... ... 055 ... ... ... +023: 056 ... ... ... 057 ... ... ... 058 ... ... ... 059 ... ... ... 060 ... ... ... 061 ... ... ... 062 ... ... ... 063 ... ... ... +024: 064 ... ... ... 065 ... ... ... 066 ... ... ... 067 ... ... ... 068 ... ... ... 069 ... ... ... 070 ... ... ... 071 ... ... ... +025: 072 ... ... ... 073 ... ... ... 074 ... ... ... 075 ... ... ... 076 ... ... ... 077 ... ... ... 078 ... ... ... 079 ... ... ... +026: 080 ... ... ... 081 ... ... ... 082 ... ... ... 083 ... ... ... 084 ... ... ... 085 ... ... ... 086 ... ... ... 087 ... ... ... +027: 088 ... ... ... 089 ... ... ... 090 ... ... ... 091 ... ... ... 092 ... ... ... 093 ... ... ... 094 ... ... ... 095 ... ... ... +028: 096 ... ... ... 097 ... ... ... 098 ... ... ... 099 ... ... ... 100 ... ... ... 101 ... ... ... 102 ... ... ... 103 ... ... ... +029: 104 ... ... ... 105 ... ... ... 106 ... ... ... 107 ... ... ... 108 ... ... ... 109 ... ... ... 110 ... ... ... 111 ... ... ... +030: 112 ... ... ... 113 ... ... ... 114 ... ... ... 115 ... ... ... 116 ... ... ... 117 ... ... ... 118 ... ... ... 119 ... ... ... +031: 120 ... ... ... 121 ... ... ... 122 ... ... ... 123 ... ... ... 124 ... ... ... 125 ... ... ... 126 ... ... ... 127 ... ... ... +``` + +## regs (from smem read) + +``` + 000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 +000: 000 008 016 024 032 040 048 056 064 072 080 088 096 104 112 120 000 008 016 024 032 040 048 056 064 072 080 088 096 104 112 120 +001: 000 008 016 024 032 040 048 056 064 072 080 088 096 104 112 120 000 008 016 024 032 040 048 056 064 072 080 088 096 104 112 120 +002: 000 008 016 024 032 040 048 056 064 072 080 088 096 104 112 120 000 008 016 024 032 040 048 056 064 072 080 088 096 104 112 120 +003: 000 008 016 024 032 040 048 056 064 072 080 088 096 104 112 120 000 008 016 024 032 040 048 056 064 072 080 088 096 104 112 120 +004: 033 041 049 057 001 009 017 025 097 105 113 121 065 073 081 089 033 041 049 057 001 009 017 025 097 105 113 121 065 073 081 089 +005: 033 041 049 057 001 009 017 025 097 105 113 121 065 073 081 089 033 041 049 057 001 009 017 025 097 105 113 121 065 073 081 089 +006: 033 041 049 057 001 009 017 025 097 105 113 121 065 073 081 089 033 041 049 057 001 009 017 025 097 105 113 121 065 073 081 089 +007: 033 041 049 057 001 009 017 025 097 105 113 121 065 073 081 089 033 041 049 057 001 009 017 025 097 105 113 121 065 073 081 089 +008: 066 074 082 090 098 106 114 122 002 010 018 026 034 042 050 058 066 074 082 090 098 106 114 122 002 010 018 026 034 042 050 058 +009: 066 074 082 090 098 106 114 122 002 010 018 026 034 042 050 058 066 074 082 090 098 106 114 122 002 010 018 026 034 042 050 058 +010: 066 074 082 090 098 106 114 122 002 010 018 026 034 042 050 058 066 074 082 090 098 106 114 122 002 010 018 026 034 042 050 058 +011: 066 074 082 090 098 106 114 122 002 010 018 026 034 042 050 058 066 074 082 090 098 106 114 122 002 010 018 026 034 042 050 058 +012: 099 107 115 123 067 075 083 091 035 043 051 059 003 011 019 027 099 107 115 123 067 075 083 091 035 043 051 059 003 011 019 027 +013: 099 107 115 123 067 075 083 091 035 043 051 059 003 011 019 027 099 107 115 123 067 075 083 091 035 043 051 059 003 011 019 027 +014: 099 107 115 123 067 075 083 091 035 043 051 059 003 011 019 027 099 107 115 123 067 075 083 091 035 043 051 059 003 011 019 027 +015: 099 107 115 123 067 075 083 091 035 043 051 059 003 011 019 027 099 107 115 123 067 075 083 091 035 043 051 059 003 011 019 027 +016: 004 012 020 028 036 044 052 060 068 076 084 092 100 108 116 124 004 012 020 028 036 044 052 060 068 076 084 092 100 108 116 124 +017: 004 012 020 028 036 044 052 060 068 076 084 092 100 108 116 124 004 012 020 028 036 044 052 060 068 076 084 092 100 108 116 124 +018: 004 012 020 028 036 044 052 060 068 076 084 092 100 108 116 124 004 012 020 028 036 044 052 060 068 076 084 092 100 108 116 124 +019: 004 012 020 028 036 044 052 060 068 076 084 092 100 108 116 124 004 012 020 028 036 044 052 060 068 076 084 092 100 108 116 124 +020: 037 045 053 061 005 013 021 029 101 109 117 125 069 077 085 093 037 045 053 061 005 013 021 029 101 109 117 125 069 077 085 093 +021: 037 045 053 061 005 013 021 029 101 109 117 125 069 077 085 093 037 045 053 061 005 013 021 029 101 109 117 125 069 077 085 093 +022: 037 045 053 061 005 013 021 029 101 109 117 125 069 077 085 093 037 045 053 061 005 013 021 029 101 109 117 125 069 077 085 093 +023: 037 045 053 061 005 013 021 029 101 109 117 125 069 077 085 093 037 045 053 061 005 013 021 029 101 109 117 125 069 077 085 093 +024: 070 078 086 094 102 110 118 126 006 014 022 030 038 046 054 062 070 078 086 094 102 110 118 126 006 014 022 030 038 046 054 062 +025: 070 078 086 094 102 110 118 126 006 014 022 030 038 046 054 062 070 078 086 094 102 110 118 126 006 014 022 030 038 046 054 062 +026: 070 078 086 094 102 110 118 126 006 014 022 030 038 046 054 062 070 078 086 094 102 110 118 126 006 014 022 030 038 046 054 062 +027: 070 078 086 094 102 110 118 126 006 014 022 030 038 046 054 062 070 078 086 094 102 110 118 126 006 014 022 030 038 046 054 062 +028: 103 111 119 127 071 079 087 095 039 047 055 063 007 015 023 031 103 111 119 127 071 079 087 095 039 047 055 063 007 015 023 031 +029: 103 111 119 127 071 079 087 095 039 047 055 063 007 015 023 031 103 111 119 127 071 079 087 095 039 047 055 063 007 015 023 031 +030: 103 111 119 127 071 079 087 095 039 047 055 063 007 015 023 031 103 111 119 127 071 079 087 095 039 047 055 063 007 015 023 031 +031: 103 111 119 127 071 079 087 095 039 047 055 063 007 015 023 031 103 111 119 127 071 079 087 095 039 047 055 063 007 015 023 031 +``` + +## output gmem (write) + +``` + 000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 +000: 000 ... ... ... 001 ... ... ... 002 ... ... ... 003 ... ... ... 004 ... ... ... 005 ... ... ... 006 ... ... ... 007 ... ... ... +001: 008 ... ... ... 009 ... ... ... 010 ... ... ... 011 ... ... ... 012 ... ... ... 013 ... ... ... 014 ... ... ... 015 ... ... ... +002: 016 ... ... ... 017 ... ... ... 018 ... ... ... 019 ... ... ... 020 ... ... ... 021 ... ... ... 022 ... ... ... 023 ... ... ... +003: 024 ... ... ... 025 ... ... ... 026 ... ... ... 027 ... ... ... 028 ... ... ... 029 ... ... ... 030 ... ... ... 031 ... ... ... +004: 032 ... ... ... 033 ... ... ... 034 ... ... ... 035 ... ... ... 036 ... ... ... 037 ... ... ... 038 ... ... ... 039 ... ... ... +005: 040 ... ... ... 041 ... ... ... 042 ... ... ... 043 ... ... ... 044 ... ... ... 045 ... ... ... 046 ... ... ... 047 ... ... ... +006: 048 ... ... ... 049 ... ... ... 050 ... ... ... 051 ... ... ... 052 ... ... ... 053 ... ... ... 054 ... ... ... 055 ... ... ... +007: 056 ... ... ... 057 ... ... ... 058 ... ... ... 059 ... ... ... 060 ... ... ... 061 ... ... ... 062 ... ... ... 063 ... ... ... +008: 064 ... ... ... 065 ... ... ... 066 ... ... ... 067 ... ... ... 068 ... ... ... 069 ... ... ... 070 ... ... ... 071 ... ... ... +009: 072 ... ... ... 073 ... ... ... 074 ... ... ... 075 ... ... ... 076 ... ... ... 077 ... ... ... 078 ... ... ... 079 ... ... ... +010: 080 ... ... ... 081 ... ... ... 082 ... ... ... 083 ... ... ... 084 ... ... ... 085 ... ... ... 086 ... ... ... 087 ... ... ... +011: 088 ... ... ... 089 ... ... ... 090 ... ... ... 091 ... ... ... 092 ... ... ... 093 ... ... ... 094 ... ... ... 095 ... ... ... +012: 096 ... ... ... 097 ... ... ... 098 ... ... ... 099 ... ... ... 100 ... ... ... 101 ... ... ... 102 ... ... ... 103 ... ... ... +013: 104 ... ... ... 105 ... ... ... 106 ... ... ... 107 ... ... ... 108 ... ... ... 109 ... ... ... 110 ... ... ... 111 ... ... ... +014: 112 ... ... ... 113 ... ... ... 114 ... ... ... 115 ... ... ... 116 ... ... ... 117 ... ... ... 118 ... ... ... 119 ... ... ... +015: 120 ... ... ... 121 ... ... ... 122 ... ... ... 123 ... ... ... 124 ... ... ... 125 ... ... ... 126 ... ... ... 127 ... ... ... +016: 000 ... ... ... 001 ... ... ... 002 ... ... ... 003 ... ... ... 004 ... ... ... 005 ... ... ... 006 ... ... ... 007 ... ... ... +017: 008 ... ... ... 009 ... ... ... 010 ... ... ... 011 ... ... ... 012 ... ... ... 013 ... ... ... 014 ... ... ... 015 ... ... ... +018: 016 ... ... ... 017 ... ... ... 018 ... ... ... 019 ... ... ... 020 ... ... ... 021 ... ... ... 022 ... ... ... 023 ... ... ... +019: 024 ... ... ... 025 ... ... ... 026 ... ... ... 027 ... ... ... 028 ... ... ... 029 ... ... ... 030 ... ... ... 031 ... ... ... +020: 032 ... ... ... 033 ... ... ... 034 ... ... ... 035 ... ... ... 036 ... ... ... 037 ... ... ... 038 ... ... ... 039 ... ... ... +021: 040 ... ... ... 041 ... ... ... 042 ... ... ... 043 ... ... ... 044 ... ... ... 045 ... ... ... 046 ... ... ... 047 ... ... ... +022: 048 ... ... ... 049 ... ... ... 050 ... ... ... 051 ... ... ... 052 ... ... ... 053 ... ... ... 054 ... ... ... 055 ... ... ... +023: 056 ... ... ... 057 ... ... ... 058 ... ... ... 059 ... ... ... 060 ... ... ... 061 ... ... ... 062 ... ... ... 063 ... ... ... +024: 064 ... ... ... 065 ... ... ... 066 ... ... ... 067 ... ... ... 068 ... ... ... 069 ... ... ... 070 ... ... ... 071 ... ... ... +025: 072 ... ... ... 073 ... ... ... 074 ... ... ... 075 ... ... ... 076 ... ... ... 077 ... ... ... 078 ... ... ... 079 ... ... ... +026: 080 ... ... ... 081 ... ... ... 082 ... ... ... 083 ... ... ... 084 ... ... ... 085 ... ... ... 086 ... ... ... 087 ... ... ... +027: 088 ... ... ... 089 ... ... ... 090 ... ... ... 091 ... ... ... 092 ... ... ... 093 ... ... ... 094 ... ... ... 095 ... ... ... +028: 096 ... ... ... 097 ... ... ... 098 ... ... ... 099 ... ... ... 100 ... ... ... 101 ... ... ... 102 ... ... ... 103 ... ... ... +029: 104 ... ... ... 105 ... ... ... 106 ... ... ... 107 ... ... ... 108 ... ... ... 109 ... ... ... 110 ... ... ... 111 ... ... ... +030: 112 ... ... ... 113 ... ... ... 114 ... ... ... 115 ... ... ... 116 ... ... ... 117 ... ... ... 118 ... ... ... 119 ... ... ... +031: 120 ... ... ... 121 ... ... ... 122 ... ... ... 123 ... ... ... 124 ... ... ... 125 ... ... ... 126 ... ... ... 127 ... ... ... +``` diff --git a/tests/cpp/test_transpose.cpp b/tests/cpp/test_transpose.cpp index 4e3864e6a4a..c08179c1927 100644 --- a/tests/cpp/test_transpose.cpp +++ b/tests/cpp/test_transpose.cpp @@ -8,6 +8,7 @@ #include #include +#include "device_lower/analysis/bank_conflict.h" #include "exceptions.h" #include "ops/all_ops.h" #include "optimization_pass.h" @@ -20,6 +21,7 @@ #include "scheduler/transpose.h" #include "scheduler/utils.h" #include "tests/cpp/utils.h" +#include "type.h" #include "validator_utils.h" namespace nvfuser { @@ -1407,4 +1409,95 @@ TEST_F(TransposeTest, DanglingBroadcastIssue4957) { testValidate(executor_cache.fusion(), outputs, {t0}, __LINE__, __FILE__); } +TEST_F(TransposeTest, SwizzleNoBankConflict) { + auto fusion_ptr = std::make_unique(); + FusionGuard fg(fusion_ptr.get()); + Fusion& fusion = *fusion_ptr; + + auto dtype = DataType::Float; + auto tv0 = makeContigConcreteTensor({262144, 5120}, dtype); + fusion.addInput(tv0); + auto tv1 = transpose(tv0, 0, 1); + fusion.addOutput(tv1); + + auto options = + at::TensorOptions().dtype(data_type_to_aten(dtype)).device(at::kCUDA, 0); + at::Tensor input0 = at::randn({262144, 5120}, options); + + auto input_cache = tv0->cacheAfter(); + auto output_cache = tv1->cacheBefore(); + input_cache->setMemoryType(MemoryType::Shared); + + // Step-1, tiling and parallelizing non-tile dimensions + int64_t tile_size1 = 32, tile_size2 = 32; + // Group 1 (output-side layout [y, x]). + for (auto tv : {output_cache, tv1}) { + // [y, x] -> [y/tile_size2, tile_size2, x/tile_size1, tile_size1] + tv->split(1, tile_size1); + tv->split(0, tile_size2); + // [x/tile_size1, y/tile_size2, tile_size1, tile_size2] + tv->reorder({{0, 1}, {1, 3}, {2, 0}, {3, 2}}); + // [x/tile_size1 * y/tile_size2, tile_size1, tile_size2] + tv->merge(0); + tv->split(0, 1); + tv->axis(1)->parallelize(ParallelType::Unswitch); + tv->axis(0)->parallelize(ParallelType::BIDx); + } + // Group 2 (input-side layout [x, y]). + for (auto tv : {tv0, input_cache}) { + // [x, y] -> [x/tile_size1, tile_size1, y/tile_size2, tile_size2] + tv->split(1, tile_size2); + tv->split(0, tile_size1); + // [x/tile_size1, y/tile_size2, tile_size1, tile_size2] + tv->reorder({{1, 2}, {2, 1}}); + // [x/tile_size1 * y/tile_size2, tile_size1, tile_size2] + tv->merge(0); + tv->split(0, 1); + tv->axis(1)->parallelize(ParallelType::Unswitch); + tv->axis(0)->parallelize(ParallelType::BIDx); + } + + // Step-2, schedule input shared cache to avoid bank conflict + int64_t pos = 2; + int64_t vectorize_factor = 16 / dataTypeSizeByte(dtype), + threads_per_block = 128; + // Schedule input shared cache. + // [BIDx, Unswitch, tile_size1, tile_size2] + input_cache->split(3, vectorize_factor); + // [BIDx, Unswitch, tile_size1, tile_size2/vectorize_factor, + // vectorize_factor] + input_cache->split(2, vectorize_factor); + // [BIDx, Unswitch, tile_size1/vectorize_factor, vectorize_factor, + // tile_size2/vectorize_factor, vectorize_factor] + input_cache->swizzle(SwizzleType::XOR, 2, 4); + input_cache->merge(2); + input_cache->merge(2); + input_cache->split(2, threads_per_block); + // [BIDx, Unswitch, Unroll, TIDx, Vectorize] + input_cache->setAllocationDomain(input_cache->getLoopDomain(), true); + input_cache->axis(2)->parallelize(ParallelType::Unroll); + input_cache->axis(3)->parallelize(ParallelType::TIDx); + input_cache->axis(4)->parallelize(ParallelType::Vectorize); + + // Step-3, schedule output cache + for (auto tv : {output_cache, tv1}) { + tv->reorder({{-2, -1}}); + // [..., tile2, tile1] + tv->merge(pos); + tv->split(pos, vectorize_factor); + tv->split(pos, threads_per_block); + tv->axis(2)->parallelize(ParallelType::Unroll); + tv->axis(3)->parallelize(ParallelType::TIDx); + if (tv == tv1) { + tv->axis(4)->parallelize(ParallelType::Vectorize); + } + } + inlineMost(); + KernelExecutor ke; + ke.compile(&fusion, {input0}); + ASSERT_TRUE(getBankConflictInfo(ke.compiledKernel()->kernel()).empty()); + auto outputs = ke.run({input0}); + testValidate(&fusion, outputs, {input0}, __LINE__, __FILE__); +} + } // namespace nvfuser