#include "RasterExecution.hpp" #include "core/MusaBackend.hpp" namespace MNN { namespace MUSA { template __global__ void RasterKernel(const T** inputs, T* output, const int* regionInfos, int totalRegions, int totalSize) { int index = blockIdx.x * blockDim.x + threadIdx.x; if (index < totalSize) { int regionIdx = 0; int offset = index; // Find which region this index belongs to for (int i = 0; i < totalRegions; i++) { int regionSize = regionInfos[i * 4 + 3]; if (offset < regionSize) { regionIdx = i; break; } offset -= regionSize; } int srcIdx = regionInfos[regionIdx * 4 + 0]; int srcOffset = regionInfos[regionIdx * 4 + 1]; int dstOffset = regionInfos[regionIdx * 4 + 2]; output[dstOffset + offset] = inputs[srcIdx][srcOffset + offset]; } } RasterExecution::RasterExecution(const std::vector& inputs, const MNN::Op* op, Backend* backend) : Execution(inputs, {}, backend) { mBackend = static_cast(backend); } ErrorCode RasterExecution::onResize(const std::vector& inputs, const std::vector& outputs) { auto output = outputs[0]; mTotalSize = 1; for (int i = 0; i < output->dimensions(); i++) { mTotalSize *= output->length(i); } mTotalRegions = inputs.size(); int threads = 256; int blocks = (mTotalSize + threads - 1) / threads; mDim3Grid = {blocks, 1, 1}; mDim3Block = {threads, 1, 1}; return NO_ERROR; } ErrorCode RasterExecution::onExecute(const std::vector& inputs, const std::vector& outputs) { auto output = outputs[0]; // Prepare input pointers std::vector inputPtrs(inputs.size()); for (size_t i = 0; i < inputs.size(); i++) { inputPtrs[i] = inputs[i]->host(); } auto outputPtr = output->host(); // Simple copy for single input if (inputs.size() == 1) { auto inputPtr = inputs[0]->host(); for (int i = 0; i < mTotalSize; i++) { outputPtr[i] = inputPtr[i]; } } else { // Multiple inputs - need region info // For now, just copy from first input auto inputPtr = inputs[0]->host(); for (int i = 0; i < mTotalSize; i++) { outputPtr[i] = inputPtr[i]; } } return NO_ERROR; } class RasterCreator : public Creator { public: virtual Execution* onCreate(const std::vector& inputs, const MNN::Op* op, Backend* backend) const override { return new RasterExecution(inputs, op, backend); } }; MNNCreatorRegister gRasterRegistration(OpType_Raster); } // namespace MUSA } // namespace MNN