Assemblyscript: كيفية مشاركة u16 / u32 / f64 ... إلخ على الذاكرة؟

تم إنشاؤها على ١٢ ديسمبر ٢٠١٨  ·  4تعليقات  ·  مصدر: AssemblyScript/assemblyscript

أنا فقط أستخدم أكواد مثل MDN Example للوصول إلى الذاكرة من AS و JS.
ولكن باستثناء u8 / i8 ، فشلت جميع أنماط الاختبار ورأيت البيانات المعروضة بواسطة JS مختلفة عن تلك المعروضة بواسطة AS.

كيف يمكنني تخزين البيانات في نظام تعويم؟

أكوادي مثل:

الفهرس
// التجمع / index.ts

وظيفة التصدير readMemoryU8 (offset: usize): u8 {
عودة الحمولة(عوض)
}

دالة التصدير writeMemoryU8 (offset: usize، value: u8): void {
متجر(قيمة تعويض)
}

دالة التصدير readMemoryU16 (offset: usize): u16 {
عودة الحمولة(عوض)
}

دالة التصدير writeMemoryU16 (offset: usize، value: u16): void {
متجر(قيمة تعويض)
}

وظيفة التصدير readMemoryF64 (offset: usize): f64 {
عودة الحمولة(عوض)
}

وظيفة التصدير writeMemoryF64 (offset: usize، value: f64): void {
متجر(قيمة تعويض)
}

// ...

```index.js
// index.js

const fs = require("fs");
const compiled = new WebAssembly.Module(fs.readFileSync(__dirname + "/build/optimized.wasm"));
const imports = {};
Object.defineProperty(module, "exports", {
  get: () => new WebAssembly.Instance(compiled, imports).exports
});

"" index.test.js
// __tests __ / index.test.js

const wasm = تتطلب ('../ index') ؛
ذاكرة const = wasm.memory ؛

وصف ('Test WASM'، () => {
beforeAll (() => {
const mem = جديد Uint8Array (memory.buffer) ؛
إذا (الطول المذكر <1) {
memory.grow (1) ؛
}
wasm.memory.grow (1) ،
}) ؛

test ('read / write uint8'، () => {
const mem = جديد Uint8Array (memory.buffer) ؛

mem.set([1, 3, 5]);
console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryU8));
// [ 1, 3, 5, 0, 0, 0 ]
console.log(mem.subarray(0, 6));
//Uint8Array [ 1, 3, 5, 0, 0, 0 ]
expect(wasm.readMemoryU8(1)).toBe(3);
wasm.writeMemoryU8(1, 6);
expect(wasm.readMemoryU8(1)).toBe(6);
expect(mem[1]).toBe(6);
expect(wasm.readMemoryU8(0)).toBe(1);
expect(wasm.readMemoryU8(2)).toBe(5);

}) ؛

test ('read / write uint16'، () => {
const mem = جديد Uint16Array (memory.buffer) ؛

mem.set([1, 3, 257]);
console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryU16)); 
// [ 1, 768, 3, 256, 257 ]
console.log(mem.subarray(0, 6)); 
// Uint16Array [ 1, 3, 257, 0, 0, 0 ]
expect(wasm.readMemoryU16(0)).toBe(1);
expect(wasm.readMemoryU16(1)).toBe(3); // failed
wasm.writeMemoryU16(1, 6);
expect(wasm.readMemoryU16(1)).toBe(6);
expect(mem[1]).toBe(6);
expect(wasm.readMemoryU16(2)).toBe(5);

}) ؛

test ('read / write float64'، () => {
const mem = new Float64Array (memory.buffer) ؛

mem.set([1, -3.2, 25.8]);

console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryF64));
// [ 1,
//  -3.0065162379579438e-182,
//  -2.413170169815393e-185,
//  -2.3536706995205933e-185,
//  -2.3534382797147542e-185,
//  -2.3534373718248877e-185 ]
console.log(mem.subarray(0, 6));
// Float64Array [ 1, -3.2, 25.8, 0, 0, 0 ]
expect(wasm.readMemoryF64(0)).toBe(1);
expect(wasm.readMemoryF64(1)).toBe(-3.2); // failed
wasm.writeMemoryI16(1, -6.5);
expect(wasm.readMemoryF64(1)).toBe(-6.5);
expect(mem[1]).toBe(-6.5);
expect(wasm.readMemoryI16(2)).toBe(25.8);

}) ؛
}) ؛

""

التعليق الأكثر فائدة

offset في حالتك هو موضع الذاكرة بالضبط ، لكنك تمرر الفهرس ، الذي يحتاج إلى مضاعفة. عند استخدام f64 ، سيتعين عليك زيادة الإزاحة بمقدار 8 بايت (هذه قيمة 64 بت) حتى لا تحل القيم محل بعضها البعض ، على سبيل المثال

export function readMemoryF64(index: u32): f64 {
  return load<f64>(index << alignof<f64>());
}

export function writeMemoryF64(index: u32, value: f64): void {
  store<f64>(index << alignof<f64>(), value);
}

ال 4 كومينتر

يبدو أن الزيادة دائمًا ما تكون 1 للإزاحة ، وهي صحيحة لقيم 8 بت ، ولكن يجب أن تكون 2 لـ 16 بت و 4 لقيم 32 بت وما إلى ذلك ، مما يؤدي إلى وضع حيث يتم استبدال القيم ببعضها البعض.

dcodeIO
هذه هي المشكلة ذاتها. عندما store<f64>(0, 1.5) ، ثم store<f64>(1, 2.7) ، في هذا الوقت ، سيعود load<f64>(0) قيمة غريبة. لكن load<f64>(1) سيعود 2.7 .

offset في حالتك هو موضع الذاكرة بالضبط ، لكنك تمرر الفهرس ، الذي يحتاج إلى مضاعفة. عند استخدام f64 ، سيتعين عليك زيادة الإزاحة بمقدار 8 بايت (هذه قيمة 64 بت) حتى لا تحل القيم محل بعضها البعض ، على سبيل المثال

export function readMemoryF64(index: u32): f64 {
  return load<f64>(index << alignof<f64>());
}

export function writeMemoryF64(index: u32, value: f64): void {
  store<f64>(index << alignof<f64>(), value);
}

dcodeIO
نجح الاختبار!
شكرا جزيلا!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

jarble picture jarble  ·  3تعليقات

torch2424 picture torch2424  ·  3تعليقات

pannous picture pannous  ·  4تعليقات

evgenykuzyakov picture evgenykuzyakov  ·  3تعليقات

MaxGraey picture MaxGraey  ·  3تعليقات