In CUDA, gibt es eine intrinsische oder eine andere API, die den Wert eines Zeigers oder die Adresse einer Variablen angibt, die den Adressraum prüft, auf den sich der Zeiger bezieht?Wie unterscheidet man Zeiger auf gemeinsamen und globalen Speicher?
5
A
Antwort
6
Die CUDA-Header-Datei sm_20_intrinsics.h
definiert die Funktion
__device__ unsigned int __isGlobal(const void *ptr)
{
unsigned int ret;
asm volatile ("{ \n\t"
" .reg .pred p; \n\t"
" isspacep.global p, %1; \n\t"
" selp.u32 %0, 1, 0, p; \n\t"
#if (defined(_MSC_VER) && defined(_WIN64)) || defined(__LP64__)
"} \n\t" : "=r"(ret) : "l"(ptr));
#else
"} \n\t" : "=r"(ret) : "r"(ptr));
#endif
return ret;
}
Diese Funktion gibt 1
wenn generische Adresse ptr
in globaler Speicherplatz ist. Es gibt 0
zurück, wenn sich ptr
in gemeinsam genutztem, lokalem oder konstantem Speicherplatz befindet.
Die PTX-Anweisung isspacep
übernimmt das schwere Heben. Es scheint, als ob wir in der Lage sein sollten, die analoge Funktion auf diese Weise aufzubauen:
__device__ unsigned int __isShared(const void *ptr)
{
unsigned int ret;
asm volatile ("{ \n\t"
" .reg .pred p; \n\t"
" isspacep.shared p, %1; \n\t"
" selp.u32 %0, 1, 0, p; \n\t"
#if (defined(_MSC_VER) && defined(_WIN64)) || defined(__LP64__)
"} \n\t" : "=r"(ret) : "l"(ptr));
#else
"} \n\t" : "=r"(ret) : "r"(ptr));
#endif
return ret;
}
Verwandte Themen
- 1. C - fork() und gemeinsamen Speicher
- 2. Dynamischer Speicher (Calloc) und Zeiger auf Zeiger [C]
- 3. Zeiger innerhalb des gemeinsamen Speichersegments
- 4. Löschen Sie alle gemeinsamen Speicher und Semaphoren auf Linux
- 5. Wie std gemeinsamen Zeiger für valarray
- 6. Speicher Datenbankverbindung in einer globalen Variablen
- 7. Bankkonfliktfreier Zugriff im gemeinsamen Speicher
- 8. Initialisierungsproblem beim gemeinsamen Speicher (c)
- 9. Wie unterscheidet man HTTP- und CLI-Anfragen?
- 10. Mehrdimensionales Array in openCL ohne gemeinsamen Speicher?
- 11. wie man zwischen Kommentaren und Antworten unterscheidet
- 12. Wie unterscheidet man zwischen Sprachanruf und Videoanruf auf Android?
- 13. Wie unterscheidet man Rs und% -Werte?
- 14. Zeiger auf einen Zeiger auf eine Struktur und Malloc-Speicher für Array
- 15. C++ - Wie kann man brechen, wenn sich die Anzahl der Referenzen auf einen gemeinsamen Zeiger ändert?
- 16. Wie kann ich einen gemeinsamen Speicher in 3 unterschiedlich große mmap Zeiger in C teilen?
- 17. malloc gibt Zeiger auf zugewiesenen Speicher zurück
- 18. Zugriff auf den globalen Speicher in CUDA ist langsam
- 19. Wie unterscheidet man Annotation Pins?
- 20. Wie unterscheidet man von undoMove?
- 21. Wie unterscheidet man bekannte lokale Parameter von globalen Parametern in lmfit?
- 22. Unterscheidet sich die Operatorpriorität in C++ für Zeiger und Iteratoren?
- 23. Wie viel Speicher verwendet ein C++ Zeiger?
- 24. didReceiveMemoryWarning - Wie unterscheidet man Warnstufen?
- 25. Wie man mit einem Zeiger auf 0xCCCCCCCC
- 26. Iterieren durch Objekte mit einer gemeinsamen Basisklasse in unterschiedlichen Speicher
- 27. kopieren globalen Speicher von CUDA-Threads
- 28. Wie unterscheidet man zwischen ios UIWebview und ios mWeb?
- 29. Wie unterscheidet man zwischen Abmeldung und Sitzung abgelaufen?
- 30. Wie Ausnahmedetails auf gemeinsamen error.cshtml
Beachten Sie, dass es auch 'isspacep.local' für den lokalen Speicher gibt. – BenC