peringatan: anotasi __host__ pada fungsi default diabaikan ‹- mengapa?

Beralih dari CUDA 8.0 ke CUDA 9.0 RC, saya mendapat peringatan tentang:

__host__ __device__ ~Foo() = default;

Peringatannya adalah:

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

yang tidak saya gunakan sebelumnya. Haruskah saya menerima peringatan ini? Apa salahnya menunjukkan Anda menginginkan destruktor default di perangkat dan sisi host?


person einpoklum    schedule 28.09.2017    source sumber
comment
Saya pikir Anda mungkin harus mendapat peringatan. Men-default suatu konstruktor atau destruktor berarti memberi tahu kompiler untuk menghasilkan implementasi default sepelenya sendiri secara otomatis. Menambahkan anotasi tidak relevan dalam kasus ini. Kedua kompiler akan menghasilkan default, yang menentukan bahwa default dari host atau kompiler perangkat harus ada pada host dan perangkat, dalam kasus ini salah.   -  person talonmies    schedule 28.09.2017
comment
@talonmies: Jadi, maksud Anda meskipun, tanpa baris ini, tidak ada destruktor default yang dibuat di sisi host atau di sisi perangkat, saya tetap harus memilikinya tanpa anotasi apa pun?   -  person einpoklum    schedule 28.09.2017
comment
NVIDIA mengklaim bahwa rantai alat perangkat mendukung N2346 . Jika Anda menginginkan perilaku itu (dan benar-benar memahami apa yang diperlukan), maka gunakanlah konstruktor atau destruktor default. Namun dalam hal ini, menentukan __host__ __device__ untuk fungsi default tidak masuk akal bagi saya, dan menurut saya peringatan itu valid. Tapi apa yang aku tahu....   -  person talonmies    schedule 28.09.2017
comment
@talonmies: Yang saya inginkan adalah menggunakan dtor yang dibuat secara default meskipun tidak dibuat secara implisit. Saya berpikir itulah yang dimaksud dengan N2346 meskipun saya tidak sepenuhnya yakin. Saya bisa menghindarinya dengan destruktor kosong, tetapi ada kode lain dengan masalah yang sama, seperti operator kesetaraan, dll.   -  person einpoklum    schedule 28.09.2017
comment
Sadarilah bahwa destruktor kosong dan destruktor default bukanlah hal yang sama. Ini benar-benar pertanyaan pengacara bahasa dan saya jelas bukan salah satunya, jadi saya bahkan tidak akan mencoba menjawabnya.   -  person talonmies    schedule 28.09.2017
comment
@talonmies Peringatan yang sama terjadi untuk konstruktor default dan operator penugasan. Jika Anda menghapus __host__ __device__ , bagaimana nvcc mengetahui bahwa objek kelas/struct akan dibuat di memori perangkat?   -  person Matthias    schedule 06.10.2017
comment
@Matthias: Tindak lanjut sangat terlambat, tapi ingat nvcc bukan kompiler. Ia menjalankan semua kode melalui dua jalur kompiler paralel (host dan perangkat), dan setiap kompiler akan mengeluarkan implementasi defaultnya sendiri. Peringatan ini muncul karena alasan ini -- kompiler kode perangkat melihat dekorator __host__ diterapkan ke default perangkat dan memperingatkan bahwa itu tidak relevan pada titik tersebut dalam jalur kompilasi.   -  person talonmies    schedule 09.08.2018


Jawaban (1)


Apa salahnya menunjukkan Anda menginginkan destruktor default di perangkat dan sisi host?

Tapi bukan itu yang dikatakan kodenya. Dikatakan Anda menginginkan destruktor default sepele yang sama di host dan perangkat, dan itulah sebabnya ada peringatan, karena tidak ada kompiler (host dan perangkat) yang berpotensi mengeluarkan destruktor default yang sama (dan karena cara kerja lintasan kompilasi yang tidak mungkin terjadi).

NVIDIA mengklaim bahwa rangkaian alat perangkat terbaru mendukung N2346. Jika Anda menginginkan perilaku tersebut (dan benar-benar memahami apa yang diperlukan), maka kode yang benar adalah:

~Foo() = default;

Kedua kompiler akan secara otomatis mengeluarkan destruktor default mereka sendiri di kedua kode dan semuanya akan berfungsi.

Jika Anda menginginkan solusi peretasan untuk basis kode yang ada, tambahkan

-Xcudafe="--diag_suppress=2886" 

ke perintah build nvcc Anda harus menghilangkan peringatan tersebut, meskipun saya menyarankan untuk tidak menyembunyikan peringatan.

[Jawaban ditambahkan sebagai ringkasan diskusi komentar untuk menghilangkan pertanyaan dari daftar yang belum terjawab untuk tag CUDA. ]

person Community    schedule 09.08.2018