#optimization #matrix #mips #transpose
#оптимизация #матрица #mips #транспонирование
Вопрос:
У меня есть матрица битов размером 8×16 в виде матрицы UINT8 [16].
Я хочу транспонировать матрицу и сохранить ее как UINT16 matrix2 [8].
Это критичная по времени часть моего кода, и поэтому мне нужно сделать это как можно быстрее. Есть ли умный способ добиться этого на процессоре MIPS?
Ответ №1:
Я не думаю, что в наборе команд MIPS есть какие-либо специальные инструкции, которые помогли бы в этом, поэтому вы можете просто закодировать его на C. Вы можете создать пользовательскую инструкцию, если у вас есть доступ к RTL процессора….
Ответ №2:
Может быть, что-то вроде этого:
lbu $10, matrix
lbu $11, matrix 1
lbu $12, matrix 2
lbu $13, matrix 3
lbu $14, matrix 4
lbu $15, matrix 5
lbu $16, matrix 6
lbu $17, matrix 7
lbu $18, matrix 8
lbu $19, matrix 9
lbu $20, matrix 10
lbu $21, matrix 11
lbu $22, matrix 12
lbu $23, matrix 13
lbu $24, matrix 14
lbu $25, matrix 15
addiu $2, $0, 8
addiu $9, $0, 256
loop:
addiu $2, $2, -1
srl $9, $9, 1
addu $27, $0, $0
and $26, $10, $9
srlv $26, $26, $2
or $27, $27, $26
and $26, $11, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $12, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $13, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $14, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $15, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $16, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $17, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $18, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $19, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $20, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $21, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $22, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $23, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $24, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
and $26, $25, $9
srlv $26, $26, $2
sll $27, $27, 1
or $27, $27, $26
sll $3, $2, 1
sh $27, transposed($3)
bgez $2, loop
nop
.data 0x2000
matrix:
.byte 0x80
.byte 0x80
.byte 0x40
.byte 0x40
.byte 0x20
.byte 0x20
.byte 0x10
.byte 0x10
.byte 0x08
.byte 0x08
.byte 0x04
.byte 0x04
.byte 0x02
.byte 0x02
.byte 0x01
.byte 0x01
.data 0x3000
transposed:
.half 0
.half 0
.half 0
.half 0
.half 0
.half 0
.half 0
.half 0
Он считывает входную матрицу, а затем выполняет цикл 8 раз (по одному разу для каждой транспонированной строки матрицы).