คำเตือน: __host__ คำอธิบายประกอบในฟังก์ชันเริ่มต้นถูกละเว้น ‹- เพราะเหตุใด

เมื่อเปลี่ยนจาก CUDA 8.0 เป็น CUDA 9.0 RC ฉันได้รับคำเตือนเกี่ยวกับ:

__host__ __device__ ~Foo() = default;

คำเตือนคือ:

path/to/Foo.cuh(69): warning: __host__ annotation on a defaulted function("~Foo") is ignored

ซึ่งฉันไม่เคยได้รับมาก่อน ฉันควรได้รับคำเตือนนี้จริงหรือ? เกิดอะไรขึ้นกับการระบุว่าคุณต้องการตัวทำลายเริ่มต้นทั้งบนอุปกรณ์และฝั่งโฮสต์


person einpoklum    schedule 28.09.2017    source แหล่งที่มา
comment
ฉันคิดว่าคุณน่าจะได้รับคำเตือน การกำหนดค่าเริ่มต้นให้กับ Constructor หรือ Destructor กำลังบอกให้คอมไพเลอร์สร้างการใช้งานเริ่มต้นเล็กๆ น้อยๆ ของตัวเองโดยอัตโนมัติ การเพิ่มคำอธิบายประกอบไม่เกี่ยวข้องในกรณีนี้ คอมไพเลอร์ทั้งสองจะสร้างค่าเริ่มต้น โดยระบุว่าค่าเริ่มต้นจากโฮสต์หรือคอมไพเลอร์อุปกรณ์ควรมีอยู่บนทั้งโฮสต์และอุปกรณ์ซึ่งในกรณีนี้ไม่ถูกต้อง   -  person talonmies    schedule 28.09.2017
comment
@talonmies: คุณกำลังบอกว่าแม้ว่าหากไม่มีบรรทัดนี้ จะไม่มีการสร้าง destructor เริ่มต้นในฝั่งโฮสต์หรือฝั่งอุปกรณ์ แต่ฉันก็ยังควรจะมีมันโดยไม่มีคำอธิบายประกอบใช่ไหม   -  person einpoklum    schedule 28.09.2017
comment
NVIDIA อ้างว่า toolchain ของอุปกรณ์รองรับ N2346 . หากคุณต้องการพฤติกรรมนั้น (และเข้าใจจริงๆ ว่าสิ่งนี้เกี่ยวข้องกับอะไร) ให้ใช้คอนสตรัคเตอร์หรือตัวทำลายที่เป็นค่าเริ่มต้น แต่ในกรณีนั้นการระบุ __host__ __device__ สำหรับฟังก์ชันเริ่มต้นนั้นไม่สมเหตุสมผลสำหรับฉัน และฉันคิดว่าคำเตือนนั้นถูกต้อง แต่ฉันจะรู้อะไรล่ะ....   -  person talonmies    schedule 28.09.2017
comment
@talonmies: สิ่งที่ฉันต้องการคือใช้ dtor ที่สร้างโดยค่าเริ่มต้นแม้ว่าจะไม่ได้ถูกสร้างขึ้นโดยปริยายก็ตาม ฉันคิดว่านั่นคือสิ่งที่ N2346 เป็นเรื่องเกี่ยวกับ แม้ว่าฉันจะไม่แน่ใจทั้งหมดก็ตาม ฉันสามารถหลีกเลี่ยงมันได้ด้วยตัวทำลายล้างที่ว่างเปล่า แต่ก็มีโค้ดอื่นที่มีปัญหาเดียวกัน เช่น ตัวดำเนินการความเท่าเทียม เป็นต้น   -  person einpoklum    schedule 28.09.2017
comment
โปรดทราบว่าตัวทำลายล้างที่ว่างเปล่าและตัวทำลายเริ่มต้นนั้นไม่เหมือนกัน นี่เป็นคำถามของทนายความด้านภาษาจริงๆ และฉันก็ไม่ใช่หนึ่งในนั้นอย่างแน่นอน ดังนั้นฉันจะไม่พยายามตอบคำถามนี้ด้วยซ้ำ   -  person talonmies    schedule 28.09.2017
comment
@talonmies คำเตือนเดียวกันนี้เกิดขึ้นสำหรับตัวสร้างและตัวดำเนินการที่ได้รับมอบหมายที่เป็นค่าเริ่มต้น หากคุณลบ __host__ __device__ nvcc จะรู้ได้อย่างไรว่าวัตถุของคลาส/struct จะถูกสร้างขึ้นในหน่วยความจำอุปกรณ์   -  person Matthias    schedule 06.10.2017
comment
@Matthias: ติดตามช้ามาก แต่จำไว้ว่า nvcc ไม่ใช่คอมไพเลอร์ โดยจะรันโค้ดทั้งหมดผ่านการส่งผ่านคอมไพเลอร์แบบขนานสองครั้ง (โฮสต์และอุปกรณ์) และคอมไพเลอร์แต่ละตัวจะปล่อยการใช้งานเริ่มต้นของตัวเอง คำเตือนเกิดขึ้นด้วยเหตุผลนี้เอง -- คอมไพลเลอร์โค้ดอุปกรณ์มองเห็น __host__ มัณฑนากรที่ใช้กับค่าเริ่มต้นของอุปกรณ์ และเตือนว่า ณ จุดนั้นในวิถีการคอมไพล์ไม่เกี่ยวข้อง   -  person talonmies    schedule 09.08.2018


คำตอบ (1)


เกิดอะไรขึ้นกับการระบุว่าคุณต้องการตัวทำลายเริ่มต้นทั้งบนอุปกรณ์และฝั่งโฮสต์

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

NVIDIA อ้างว่า toolchains อุปกรณ์ล่าสุดรองรับ N2346. หากคุณต้องการพฤติกรรมนั้น (และเข้าใจจริงๆ ว่าสิ่งนี้เกี่ยวข้องกับอะไร) โค้ดที่ถูกต้องควรเป็น:

~Foo() = default;

คอมไพเลอร์ทั้งสองจะปล่อย destructor เริ่มต้นของตัวเองออกมาโดยอัตโนมัติในโค้ดทั้งสองและทุกอย่างก็จะทำงานได้

หากคุณต้องการวิธีแก้ปัญหาแบบแฮ็กสำหรับฐานโค้ดที่มีอยู่ ให้เพิ่ม

-Xcudafe="--diag_suppress=2886" 

สำหรับคำสั่ง nvcc build ของคุณควรกำจัดคำเตือน แม้ว่าฉันจะไม่แนะนำไม่ให้ระงับคำเตือนก็ตาม

[เพิ่มคำตอบเป็นบทสรุปของการอภิปรายความคิดเห็นเพื่อแยกคำถามออกจากรายการที่ยังไม่ได้ตอบสำหรับแท็ก CUDA ]

person Community    schedule 09.08.2018
comment
คุณอ้างว่า ~Foo() = default บอกเป็นนัยว่า destructor นั้นไม่มีการดำเนินการหรือไม่? นี่ไม่ใช่กรณีใน C ++: destructor ที่เป็นค่าเริ่มต้นจะเรียก destructor ของสมาชิก โอเค ฉันได้อ่านความคิดเห็นของคุณเกี่ยวกับภารกิจนี้แล้ว และดูเหมือนว่าคุณรู้เรื่องนี้ ถึงกระนั้นคำตอบก็ยังทำให้เข้าใจผิดเล็กน้อย - person Nikita Petrenko; 07.09.2019
comment
คอมไพเลอร์ทั้งสองจะปล่อย destructor เริ่มต้นของตัวเองออกมาโดยอัตโนมัติในโค้ดทั้งสองและทุกอย่างก็จะทำงานได้ ‹- คุณหมายถึง CUDA เวอร์ชันอนาคตหรือเวอร์ชันปัจจุบัน (10.x) หรือไม่? - person einpoklum; 29.12.2019
comment
ฉันหมายถึง CUDA 9 ซึ่งเป็นปัจจุบันเมื่อมีการเขียนคำตอบนี้ - person talonmies; 29.12.2019