2010-10-18 4 views
2

Je rencontre un problème très étrange: Mu 9800GT ne semble pas calculer du tout. J'ai essayé tous les hello-mondes que j'ai trouvé sur internet, voici l'un d'eux:Cuda ne calcule pas ce que l'on attend, ignore silencieusement mon code

ce programme crée un tableau 1..100 sur les hôtes, l'envoie à l'appareil, calcule un carré de chaque valeur, retourne pour héberger, imprime les résultats.

#include "stdafx.h" 

#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]; 
} 

// main routine that executes on the host 
int main(void) 
{ 
float *a_h, *a_d; // Pointer to host & device arrays 
const int N = 100; // Number of elements in arrays 
size_t size = N * sizeof(float); 
a_h = (float *)malloc(size); // Allocate array on host 
cudaMalloc((void **) &a_d, size); // Allocate array on device 
// Initialize host array and copy it to CUDA device 
for (int i=0; i<N; i++) a_h[i] = (float)i; 
cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice); 
// Do calculation on device: 
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); 
// Retrieve result from device and store it in host array 
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]); 
// Cleanup 
free(a_h); cudaFree(a_d); 
} 

de sorte que la sortie devrait être:

1 1,000

2 4,000

3 9,000

4 16,000

.. Je jure en 2009, il a parfaitement fonctionné (vista 32, deviceemu)

maintenant je sortie:

1 1,000

2 2,000

3 3,000

4 4.000

donc ma carte ne fait rien. Quel peut être le problème? La configuration est: Win7x64 visual studio 2010 32bit boîte à outils cuda 3.2 64bit

Paramètres de compilation: cuda 3.2 boîte à outils, plate-forme cible 32bit, deviceemu ou non - n'a pas d'importance, les résultats sont les mêmes. Je l'ai également essayé sur mon studio visuel 2008 de vmware xp (32bit). Le résultat est le même.

S'il vous plaît aidez-moi, j'ai à peine fait le programme pour compiler, maintenant j'en ai besoin pour travailler.

Vous pouvez également consulter mon projet avec tout ce qu'il faut de my post at nvidia forums (2,7 kb)

Merci, Ilya

+0

Hey Ilya, Je suis confronté exactement au même problème, je l'ai mis en place d'abord sur mon ordinateur de bureau compatible CUDA où il fonctionne parfaitement, et quand je suis passé sur le super ordinateur, je reçois exactement même sortie. Que pensez-vous que je devrais faire? –

Répondre

4

Votre code produit les résultats escomptés sur mon système Linux donc je suggère de vérifier les codes d'erreur renvoyés par cudaMalloc et cudaMemcpy pour s'assurer qu'il n'y a pas d'erreurs de pilote/d'exécution silencieuses. Par exemple

cudaError_t error = cudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost); 
printf("error status: %s\n", cudaGetErrorString(error)); 

devrait imprimer

error status: no error 

si l'appel est réussi.

Aussi, je crois que l'émulation de périphérique a été dépréciée dans CUDA 3.0 et entièrement supprimée dans CUDA 3.1. Je ne sais pas si c'est lié à votre problème.

Pour compiler plusieurs fichiers que vous souhaitez simplement faire quelque chose comme ça

$nvcc -c foo.cu 
$nvcc -c bar.cu 
$nvcc -o foobar foo.o bar.o 

alternativement, vous pouvez faire la liaison dans la dernière étape avec g++ comme si

$g++ -o foobar foo.o bar.o -L/usr/local/cuda/lib64 -lcudart 
+0

yep, figuré que moi-même :) erreur cudaErrorInsufficientDriver = L'exécution de CUDA est plus récente que le pilote. va maintenant supprimer tous les pilotes, redémarrer et les installer à partir de zéro –

+0

s'il vous plaît postez votre chaîne de compilation g ++ ici et je marquerai cela comme une réponse. (J'ai en fait besoin d'être exécuté sous Ubuntu, mais je n'ai aucune idée de la façon de compiler plus d'un fichier :)) –