2013-03-13 2 views
0

Хорошо, поэтому я пытаюсь изучить CUDA для «нового» FX 570, который я купил за 15 долларов, D теперь в коде нет ошибок, массив1_host начинает с его значений правильно, но когда я копирую память из устройства для размещения значений, они остаются неизменными. то же самое происходит, если я пуст из второго вызова ядра (пытаюсь несколько ядер в этом проекте) Я достаточно запутан так что спасибо за любую помощь я могу достигнуть :)Память CUDA не возвращается на хост

#include <cuda_runtime.h> 
#include <iostream> 

#pragma comment (lib, "cudart") 

#define N 5000 

__global__ void addArray(float* a, float* b) 
{ 
    a[threadIdx.x] += b[threadIdx.x]; 
} 
__global__ void timesArray(float* a, float* b) 
{ 
    a[threadIdx.x] *= b[threadIdx.x]; 
} 

int main(){ 
    float array1_host[N]; 
    float array2_host[N]; 

    float *array1_device; 
    float *array2_device; 

    cudaError_t err; 

    for(int x = 0; x < N; x++){ 
     array1_host[x] = (float) x * 2; 
     array2_host[x] = (float) x * 6; 
    } 

    err = cudaMalloc((void**)&array1_device, N*sizeof(float)); 
    err = cudaMalloc((void**)&array2_device, N*sizeof(float)); 

    err = cudaMemcpy(array1_device, array1_host, N*sizeof(float), cudaMemcpyHostToDevice); 
    err = cudaMemcpy(array2_device, array2_host, N*sizeof(float), cudaMemcpyHostToDevice); 

    dim3 dimBlock(N); 
    dim3 dimGrid (1); 

    addArray<<<dimGrid, dimBlock>>>(array1_device, array2_device); 
    timesArray<<<dimGrid, dimBlock>>>(array1_device, array2_device); 

    err = cudaMemcpy(array1_host, array1_device, N*sizeof(float), cudaMemcpyDeviceToHost); 

    cudaFree(array1_device); 
    cudaFree(array2_device); 

    std::cout << cudaGetErrorString(err) << "\n\n\n\n\n\n"; 
    std::cout << array1_host; 


    cudaDeviceReset(); 

    system("pause"); 
    return 0; 
} 
+2

Некоторые подсказки: если кто-то решает вашу проблему, вы должны принять его ответ (зеленый тик, отметьте). Это добавит вам 2 очков репутации и от 15 до человека, которые помогут. –

ответ

3

У вас есть ошибка, потому что N - 5000, но в блоках есть ограничения для threds - это зависит от возможности вычисления link to features on wiki.
Попробуйте этот код:

#define K 200 

.... 

dim3 dimBlock(K); 
dim3 dimGrid (N/K); 

Для отладки кода можно использовать cudaGetLastError() после каждого вызова ядра или другой функции, чтобы знать, где ошибки помещаются exaple about CUDA errors.

+0

Спасибо, что была именно эта проблема –