Je souhaite avoir une instance d'une classe Container allouant une mémoire de périphérique et d'hôte lors de l'initialisation. Je veux utiliser la mémoire allouée dans le code de l'appareil, sans passer le pointeur réel (pour des raisons d'API).Utilisation d'un membre de la classe hôte pointant vers la mémoire du périphérique dans le code de périphérique
Comment créer un pointeur global __device__
vers le membre pointant vers la mémoire de l'appareil? Je suis heureux d'utiliser la poussée si cela aide.
Voici un petit exemple:
#include <iostream>
struct Container {
int *h_int = (int*)malloc(4*sizeof(int));
int *d_int;
Container() {
h_int[0] = 6; h_int[1] = 6; h_int[2] = 6; h_int[3] = 6;
cudaMalloc(&d_int, 4*sizeof(int));
memcpyHostToDevice();
}
void memcpyHostToDevice() {
cudaMemcpy(d_int, h_int, 4*sizeof(int), cudaMemcpyHostToDevice);
}
void memcpyDeviceToHost() {
cudaMemcpy(h_int, d_int, 4*sizeof(int), cudaMemcpyDeviceToHost);
}
};
Container stuff;
__device__ auto d_int = &stuff.d_int; // How do I get that right?
__global__ void edit() { // To keep the API simple I do not want to pass the pointer
auto i = blockIdx.x*blockDim.x + threadIdx.x;
d_int[i] = 1 + 2*(i > 0) + 4*(i > 2);
}
int main(int argc, char const *argv[]) {
edit<<<4, 1>>>();
stuff.memcpyDeviceToHost();
std::cout << stuff.h_int[0] << stuff.h_int[1] << stuff.h_int[2] << stuff.h_int[3] << "\n";
return 0;
}
En fait, il ne fonctionne pas si je déclare 'des choses 'Dans la portée globale. Merci pour votre réponse! – qiv
@qiv: Vous ne pouvez pas compter sur le fait de travailler. C'est un comportement indéfini et il cessera de fonctionner sur vous à un moment donné. – talonmies
Cela pourrait-il être à l'origine de ce problème étrange: dans un cas de test, le moment n'est souvent conservé qu'à la première exécution, mais pas dans les exécutions consécutives? Déclarer la classe de solveur non globale l'évite (tout comme imprimer les coordonnées dans le noyau ou changer l'ordre des tests ...). – qiv