ฟังก์ชันการอัปเดตแบบอะตอมของ RenderScript

ภาพรวม

หากต้องการอัปเดตค่าที่แชร์ระหว่างหลายชุดข้อความ ให้ใช้ฟังก์ชันด้านล่าง ซึ่งจะอัปเดตค่าแบบรวมกัน กล่าวคือ การอ่าน การอัปเดต และการเขียนหน่วยความจำจะทําตามลําดับที่ถูกต้อง

ฟังก์ชันเหล่านี้ทำงานช้ากว่าฟังก์ชันที่ไม่ใช่แบบอะตอม ดังนั้นให้ใช้เฉพาะเมื่อจำเป็นต้องมีการซิงค์

โปรดทราบว่าใน RenderScript โค้ดมีแนวโน้มที่จะทำงานในเธรดแยกต่างหาก แม้ว่าคุณจะไม่ได้สร้างเธรดดังกล่าวอย่างชัดเจนก็ตาม รันไทม์ RenderScript มักจะแยกการดําเนินการของเคิร์กัล 1 รายการออกเป็นหลายเธรด การอัปเดตตัวแปรส่วนกลางควรทําด้วยฟังก์ชันแบบอะตอม หากเป็นไปได้ ให้แก้ไขอัลกอริทึมเพื่อหลีกเลี่ยงการใช้คำเหล่านี้โดยสิ้นเชิง

สรุป

ฟังก์ชัน
rsAtomicAdd การเพิ่มที่ปลอดภัยสำหรับชุดข้อความ
rsAtomicAnd การดำเนินการแบบบิตต่อบิตที่ปลอดภัยสำหรับเธรด
rsAtomicCas เปรียบเทียบและตั้งค่าแบบปลอดภัยสำหรับเธรด
rsAtomicDec การลดที่ปลอดภัยสำหรับเธรด
rsAtomicInc การเพิ่มที่ปลอดภัยสำหรับเธรด
rsAtomicMax สูงสุดที่ปลอดภัยสำหรับเธรด
rsAtomicMin ขั้นต่ำที่ปลอดภัยสำหรับเธรด
rsAtomicOr Bitwise OR ที่ปลอดภัยสำหรับเธรด
rsAtomicSub การลบที่ปลอดภัยสำหรับเธรด
rsAtomicXor การดำเนินการแบบไม่ซ้ำกันแบบบิตไวส์ที่ปลอดภัยสำหรับเธรด

ฟังก์ชัน

rsAtomicAdd : การเพิ่มที่ปลอดภัยสำหรับเธรด

int32_t rsAtomicAdd(volatile int32_t* addr, int32_t value); เพิ่มใน API ระดับ 14
int32_t rsAtomicAdd(volatile uint32_t* addr, uint32_t value); เพิ่มใน API ระดับ 20
พารามิเตอร์
addrที่อยู่ของค่าที่จะแก้ไข
ค่าจำนวนเงินที่จะเพิ่ม
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ

เพิ่มค่าไปยังค่าที่ addr แบบอะตอมิก เช่น *addr += value

rsAtomicAnd : bitwise and ที่ปลอดภัยสำหรับเธรด

int32_t rsAtomicAnd(volatile int32_t* addr, int32_t value); เพิ่มใน API ระดับ 14
int32_t rsAtomicAnd(volatile uint32_t* addr, uint32_t value); เพิ่มใน API ระดับ 20
พารามิเตอร์
addrที่อยู่ของค่าที่จะแก้ไข
ค่าค่า "ถึง" และ "ด้วย"
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ

ดำเนินการ AND แบบบิตต่อ 2 ค่าแบบอะตอม โดยจัดเก็บผลลัพธ์กลับที่ addr นั่นคือ *addr &= value

rsAtomicCas : การเปรียบเทียบและการตั้งค่าที่ปลอดภัยสำหรับเธรด

int32_t rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); เพิ่มใน API ระดับ 14
uint32_t rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); เพิ่มใน API ระดับ 14
พารามิเตอร์
addrที่อยู่ของค่าที่จะเปรียบเทียบและแทนที่หากการทดสอบผ่าน
compareValueค่าที่จะทดสอบกับ *addr
newValueค่าที่จะเขียนหากการทดสอบผ่าน
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ

หากค่าที่ addr ตรงกับ compareValue ระบบจะเขียน newValue ที่ addr นั่นคือ if (*addr == compareValue) { *addr = newValue; }

คุณสามารถตรวจสอบว่าระบบเขียนค่าแล้วโดยดูว่าค่าที่ rsAtomicCas() แสดงผลคือ compareValue

rsAtomicDec : การลดที่ปลอดภัยสำหรับเธรด

int32_t rsAtomicDec(volatile int32_t* addr); เพิ่มใน API ระดับ 14
int32_t rsAtomicDec(volatile uint32_t* addr); เพิ่มใน API ระดับ 20
พารามิเตอร์
addrที่อยู่ของค่าที่จะลด
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ

ลบ 1 จากค่าที่ addr โดยสมบูรณ์ ซึ่งเทียบเท่ากับ rsAtomicSub(addr, 1)

rsAtomicInc : การเพิ่มขึ้นที่ปลอดภัยสำหรับเธรด

int32_t rsAtomicInc(volatile int32_t* addr); เพิ่มใน API ระดับ 14
int32_t rsAtomicInc(volatile uint32_t* addr); เพิ่มใน API ระดับ 20
พารามิเตอร์
addrที่อยู่ของค่าที่จะเพิ่มขึ้น
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ

เพิ่ม 1 ลงในค่าที่ addr แบบอะตอม ซึ่งเทียบเท่ากับ rsAtomicAdd(addr, 1)

rsAtomicMax : หาค่าสูงสุดแบบปลอดภัยสำหรับเธรด

int32_t rsAtomicMax(volatile int32_t* addr, int32_t value); เพิ่มใน API ระดับ 14
uint32_t rsAtomicMax(volatile uint32_t* addr, uint32_t value); เพิ่มใน API ระดับ 14
พารามิเตอร์
addrที่อยู่ของค่าที่จะแก้ไข
ค่าค่าเปรียบเทียบ
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ

กำหนดค่าที่ addr เป็นค่าสูงสุดของ *addr และ value แบบอะตอม เช่น *addr = max(*addr, value)

rsAtomicMin : ค่าต่ำสุดที่ปลอดภัยสำหรับเธรด

int32_t rsAtomicMin(volatile int32_t* addr, int32_t value); เพิ่มใน API ระดับ 14
uint32_t rsAtomicMin(volatile uint32_t* addr, uint32_t value); เพิ่มใน API ระดับ 14
พารามิเตอร์
addrที่อยู่ของค่าที่จะแก้ไข
ค่าค่าเปรียบเทียบ
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ

ตั้งค่าที่ addr เป็นค่าต่ำสุดของ *addr และ value แบบอะตอมิก นั่นคือ *addr = min(*addr, value)

rsAtomicOr : การดำเนินการ OR แบบบิตที่ปลอดภัยสำหรับเธรด

int32_t rsAtomicOr(volatile int32_t* addr, int32_t value); เพิ่มใน API ระดับ 14
int32_t rsAtomicOr(volatile uint32_t* addr, uint32_t value); เพิ่มใน API ระดับ 20
พารามิเตอร์
addrที่อยู่ของค่าที่จะแก้ไข
ค่าค่าสำหรับหรือกับ
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ

ดำเนินการแบบอะตอมกับค่า 2 ค่าหรือแบบไบนารี โดยจัดเก็บผลลัพธ์ที่ addr นั่นคือ *addr |= value

rsAtomicSub : การลบที่ปลอดภัยสำหรับเธรด

int32_t rsAtomicSub(volatile int32_t* addr, int32_t value); เพิ่มใน API ระดับ 14
int32_t rsAtomicSub(volatile uint32_t* addr, uint32_t value); เพิ่มใน API ระดับ 20
พารามิเตอร์
addrที่อยู่ของค่าที่จะแก้ไข
ค่าจํานวนเงินที่จะหัก
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ

ลบค่าออกจากค่าที่ addr โดยสมบูรณ์ เช่น *addr -= value

rsAtomicXor : โอเปอเรเตอร์แบบเฉพาะแบบบิตไวส์ที่ปลอดภัยสำหรับเธรด

int32_t rsAtomicXor(volatile int32_t* addr, int32_t value); เพิ่มใน API ระดับ 14
int32_t rsAtomicXor(volatile uint32_t* addr, uint32_t value); เพิ่มใน API ระดับ 20
พารามิเตอร์
addrที่อยู่ของค่าที่จะแก้ไข
ค่าค่าที่จะใช้ XOR ด้วย
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ

ดำเนินการ XOR แบบบิตต่อค่า 2 ค่าแบบอะตอม โดยจัดเก็บผลลัพธ์ไว้ที่ addr นั่นคือ *addr ^= value