Biryukov239 / matrix-multiplication-kotlin

0 stars 0 forks source link

Возможные упрощения #14

Closed lounres closed 4 months ago

lounres commented 4 months ago
  1. Вместо
    if (OpenCLDevice.listDevices(Device.TYPE.GPU).isNotEmpty()) {
        return OpenCLDevice.listDevices(Device.TYPE.GPU).first()
    }
    if (OpenCLDevice.listDevices(Device.TYPE.CPU).isNotEmpty()) {
        return OpenCLDevice.listDevices(Device.TYPE.CPU).first()
    }
    return null

    можно написать просто

    OpenCLDevice.listDevices(Device.TYPE.GPU).firstOrNull() ?:
    OpenCLDevice.listDevices(Device.TYPE.CPU).firstOrNull()
  2. Вместо

    when (kernelType) {
        KernelType.WITH_WPT_OPTIMIZATION -> this.program = getWPTOptProgram(
            firstMatrix,
            secondMatrix, resultMatrix, firstRowCount, firstColumnCount, secondColumnCount, device
        )
    
        KernelType.WITH_LOCAL_MEM_OPTIMIZATION -> this.program = getLocalMemProgram(
            firstMatrix,
            secondMatrix, resultMatrix, firstRowCount, firstColumnCount, secondColumnCount, device
        )
    
        else -> this.program = getNaiveProgram(
            firstMatrix,
            secondMatrix, resultMatrix, firstRowCount, firstColumnCount, secondColumnCount, device
        )
    }

    можно написать

    this.program = when (kernelType) {
        KernelType.WITH_WPT_OPTIMIZATION -> getWPTOptProgram(
            firstMatrix,
            secondMatrix, resultMatrix, firstRowCount, firstColumnCount, secondColumnCount, device
        )
    
        KernelType.WITH_LOCAL_MEM_OPTIMIZATION -> getLocalMemProgram(
            firstMatrix,
            secondMatrix, resultMatrix, firstRowCount, firstColumnCount, secondColumnCount, device
        )
    
        else -> getNaiveProgram(
            firstMatrix,
            secondMatrix, resultMatrix, firstRowCount, firstColumnCount, secondColumnCount, device
        )
    }
  3. Переопределения переменных из Multiplier можно совместить с инициализацией этих переменных в блоке init. Например,
    override var firstMatrix: FloatArray = firstMatrix

    А потом перенести подобные определения в основной конструктор, т.е. как

    class MultiplierBasedOnGPU(
        ...,
        override var firstMatrix: FloatArray,
        ...,
    )

    А также Вы больше нигде не используете изменяемость этих переменных. Так что их можно сделать неизменяемыми как в классе Multiplier (который сейчас уже можно сделать интерфейсом), так и в его наследниках.

Biryukov239 commented 4 months ago

Постаралася учесть данные упрощения.

lounres commented 4 months ago

Осталось по аналогии совместить определение и инициализацию переменных program и resultMatrix. Плюс, не нужна изменяемость этих переменных (в Multiplyer тоже).

Biryukov239 commented 4 months ago

Исправил.

lounres commented 4 months ago

Определения и инициализации program и resultMatrix всё ещё не объединены. Я имею в виду такой statement:

override val resultMatrix: FloatArray = FloatArray(firstRowCount * secondColumnCount)
// и по аналогии для `program`.

init — нежелательный паттерн. Советуют использовать совмещённые объявление и инициализацию как выше. А если есть какая-то сложная логика, то её обычно выносят в фальш-конструктор, а основной (и причём единственный) конструктор просто закрывают (ставят модификатор internal).

Biryukov239 commented 4 months ago

Исправил.

lounres commented 4 months ago

Хорошо.