[英]CUDA memory does not return to host
好的,所以我正在嘗試為我以15美元購買的``新''FX 570學習CUDA; D現在在代碼中沒有錯誤,array1_host正確啟動了它的值,但是當我從設備復制內存到主機的值保持不變。 如果我清空第二個內核調用(在該項目中嘗試多個內核),也會發生同樣的事情,我很困惑,因此感謝您能提供的任何幫助:)
#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;
}
您有一個錯誤,因為N為5000,但是塊中的thred有限制-它取決於Wiki上功能的 Compute Capability 鏈接 。
試試這個代碼:
#define K 200
....
dim3 dimBlock( K );
dim3 dimGrid ( N/K );
要調試代碼,您可以在每次調用內核或其他函數后使用cudaGetLastError()
來了解有關CUDA錯誤的錯誤放置位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.