2013-03-13 54 views
0

好吧,所以我想學習CUDA爲我以15美元購買的'新'FX 570; D 現在在代碼中沒有錯誤,array1_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點聲望點。 – 2013-03-13 10:47:57

回答

3

你有一個錯誤,因爲N是5000,但在塊中有限制 - 它取決於計算能力link to features on wiki
試試這個代碼:

#define K 200 

.... 

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

要調試代碼,您可以使用cudaGetLastError()內核或其他功能在每次通話後知道,在錯誤放置exaple about CUDA errors

+0

謝謝你正是這個問題 – 2013-03-13 09:19:18