(dataId: DataId)
| 731 | } |
| 732 | |
| 733 | uploadToGPU(dataId: DataId): void { |
| 734 | const tensorData = this.tensorMap.get(dataId); |
| 735 | // Already on the GPU. |
| 736 | if (tensorData.resource != null) { |
| 737 | return; |
| 738 | } |
| 739 | |
| 740 | const size = webgpu_util.GPUBytesPerElement(tensorData.dtype) * |
| 741 | util.sizeFromShape(tensorData.shape); |
| 742 | let buffer; |
| 743 | const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | |
| 744 | GPUBufferUsage.COPY_DST; |
| 745 | if (tensorData.values) { |
| 746 | buffer = this.bufferManager.acquireBuffer(size, usage, true); |
| 747 | if (buffer.mapState === 'unmapped') { |
| 748 | const stagingBuffer = this.bufferManager.acquireBuffer( |
| 749 | size, GPUBufferUsage.MAP_WRITE | GPUBufferUsage.COPY_SRC, true, |
| 750 | false); |
| 751 | const arrayBuffer = stagingBuffer.getMappedRange(); |
| 752 | if (tensorData.dtype === 'int32' || tensorData.dtype === 'bool') { |
| 753 | new Int32Array(arrayBuffer).set(tensorData.values as TypedArray); |
| 754 | } else { |
| 755 | new Float32Array(arrayBuffer).set(tensorData.values as Float32Array); |
| 756 | } |
| 757 | stagingBuffer.unmap(); |
| 758 | this.ensureCommandEncoderReady(); |
| 759 | this.endComputePassEncoder(); |
| 760 | this.commandEncoder.copyBufferToBuffer( |
| 761 | stagingBuffer, 0, buffer, 0, size); |
| 762 | |
| 763 | this.stagingPendingDisposal.push(stagingBuffer); |
| 764 | } else { |
| 765 | const arrayBuffer = buffer.getMappedRange(); |
| 766 | if (tensorData.dtype === 'int32' || tensorData.dtype === 'bool') { |
| 767 | new Int32Array(arrayBuffer).set(tensorData.values as TypedArray); |
| 768 | } else { |
| 769 | new Float32Array(arrayBuffer).set(tensorData.values as Float32Array); |
| 770 | } |
| 771 | buffer.unmap(); |
| 772 | } |
| 773 | |
| 774 | // Once uploaded, don't store the values on cpu. |
| 775 | tensorData.values = null; |
| 776 | } else { |
| 777 | buffer = this.bufferManager.acquireBuffer(size, usage); |
| 778 | } |
| 779 | tensorData.resource = buffer; |
| 780 | } |
| 781 | |
| 782 | private makeUniforms(programUniform: ProgramUniform): GPUBindingResource { |
| 783 | let currentOffset = 0; |
no test coverage detected