2011-03-16 8 views
0

Salut J'ai un programme cuda qui fonctionne avec succès ici est le code pour le programme de cudacuda et C++ problème

#include <stdio.h> 
#include <cuda.h> 

    __global__ void square_array(float *a, int N) 
    { 
     int idx = blockIdx.x * blockDim.x + threadIdx.x; 
     if (idx<N) 
     a[idx] = a[idx] * a[idx]; 
    } 

    int main(void) 
    { 
     float *a_h, *a_d; 
     const int N = 10; 
     size_t size = N * sizeof(float); 
     a_h = (float *)malloc(size);   
     cudaMalloc((void **) &a_d, size); 
     for (int i=0; i<N; i++) a_h[i] = (float)i; 
     cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice); 
     int block_size = 4; 
     int n_blocks = N/block_size + (N%block_size == 0 ? 0:1); 
     square_array <<< n_blocks, block_size >>> (a_d, N); 

     cudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost); 
     // Print results 
     for (int i=0; i<N; i++) printf("%d %f\n", i, a_h[i]); 

     free(a_h); 
     cudaFree(a_d); 
    } 

maintenant je veux diviser ce code en deux fichiers signifie qu'il devrait y avoir deux fichiers un pour le code C++ ou c code et un autre fichier .cu pour le noyau. Je veux juste le faire pour apprendre et je ne veux pas écrire le même code de noyau encore et encore. quelqu'un peut-il me dire comment faire cela? comment diviser ce code en deux fichiers différents? que comment le compiler? comment écrire makefile pour cela? comment

Répondre

1

Le code qui a des extensions CUDA C doit être dans le fichier * .cu, le repos peut être dans le fichier C++.

Donc, ici, le code de votre noyau peut être déplacé vers un fichier * .cu séparé.

Pour avoir l'implémentation de la fonction principale dans le fichier C++, vous devez enrouler l'invocation du noyau (code avec square_array<<<...>>>(...);) avec la fonction C++ dont l'implémentation doit également être dans le fichier * cu.

Les fonctions cudaMalloc etc. peuvent être conservées dans un fichier C++ à condition d'inclure les en-têtes cuda appropriés.

+0

thax pour l'aide i déplacé mon code Kenel en squre nom de fichier seprate .cu #include #include __global__ square_array void (float * a, int N) { int idx = blockIdx.x * blockDim.x + identificateur de thread.X; if (idx user513164

0

Le plus gros obstacle que vous rencontrerez probablement est de - comment appeler votre noyau à partir de votre fichier cpp. C++ ne comprendra pas votre syntaxe <<< >>>. Il y a 3 façons de le faire.

  • Il suffit d'écrire une petite encapsulage fonction hôte dans votre fichier .cu

  • utiliser les fonctions de la bibliothèque CUDA (cudaConfigureCall, cudaFuncGetAttributes, cudaLaunch) --- vérifier Cuda Manuel de référence pour plus de détails, chapitre "Contrôle d'exécution" online version . Vous pouvez utiliser ces fonctions en code C++ simple, à condition d'inclure les bibliothèques cuda.

  • Inclure PTX lors de l'exécution. C'est plus difficile, mais cela vous permet de manipuler le code PTX lors de l'exécution. Cette approche JIT est expliquée dans Cuda Guide de programmation (chapitre 3.3.2) et Cuda Manuel de référence (chapitre Module de gestion) online version


fonction Encapsilating pourrait ressembler à ceci par exemple:

mystuff .cu:

... //your device square_array function 

void host_square_array(dim3 grid, dim3 block, float *deviceA, int N) { 
    square_array <<< grid, block >>> (deviceA, N); 
} 

mystuff.h

#include <cuda.h> 
void host_square_array(dim3 grid, dim3 block, float *deviceA, int N); 

mymain.cpp

#include "mystuff.h" 

int main() { ... //your normal host code 
} 
+0

thankx ur aide s'il vous plaît peut me expliquer comment suffit d'écrire une petite encapsulage fonction hôte mu .cu? Que dois-je mettre dans mon .cu et comment complile et lier mon programme – user513164

+0

user513164: Voir si ce poste est utile pour voir le .cu et la séparation de C: http://gpucoder.livejournal.com/2949.html –

+0

Thanx forhelp Je viens de le faire que maintenant je ne sais pas comment il peut Ompile u me expliquer processus de compilation – user513164