我正在測試一個代碼,其中內核旨在執行存儲在兩個指針中的兩個值之間的簡單求和。在對某個函數「壞」調用後,CUDA不能再將數據從設備複製到主機
在調用內核「add」之後,即使沒有對內核中的指針執行任何操作,我也不能再將指針的數據從主機複製到設備,然後再從主機複製到主機。但是當我評論函數被調用的語句時,我得到了正確的結果。下面是代碼:
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
__global__ void add(int *a, int *b, int *c)
{
*c = *a - *b;
}
int main(void)
{
int result, x_val, y_val; //Store data from device to host in this vars.
int *x_host, *y_host; //Pointers in host
int *tempGPU, *x_dev, *y_dev; //Pointers in device
x_host = (int *)malloc(sizeof(int));
y_host = (int *)malloc(sizeof(int));
*x_host = 8;
*y_host = 4;
x_val = -5;
y_val = -10;
printf("\n x = %d, y = %d\n", *x_host, *y_host);
cudaMalloc((void **)&tempGPU, sizeof(int));
//It's wrong to pass this arguments to the function. The problem is in this statement.
add<<<1,1>>> (x_host, y_host, tempGPU);
cudaMemcpy(&result, tempGPU, sizeof(int), cudaMemcpyDeviceToHost);
printf("\n x_host - y_host = %d\n", result);
cudaMalloc((void **)&x_dev, sizeof(int));
cudaMalloc((void **)&y_dev, sizeof(int));
*x_host = 6;
*y_host = 20;
cudaMemcpy(x_dev, x_host, sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(y_dev, y_host, sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(&x_val, x_dev, sizeof(int), cudaMemcpyDeviceToHost);
cudaMemcpy(&y_val, y_dev, sizeof(int), cudaMemcpyDeviceToHost);
printf("\n x_host = %d, y_host = %d\n", *x_host, *y_host);
printf("\n x_val = %d, y_val = %d\n", x_val, y_val);
cudaFree(tempGPU);
printf("\nCUDA: %s\n", cudaGetErrorString(cudaGetLastError()));
return 0;
}
我知道函數需要指針在設備分配的,但是爲什麼這樣的錯誤不允許我正確地使用cudaMemcpy?爲什麼當我評論該行時:
add<<<1,1>>> (x_host, y_host, tempGPU);
我得到正確的結果。謝謝。
你的問題是'x_host'和'y_host'是指向主機內存空間的指針。 '__global__ add'函數需要指向設備內存空間的指針。當你構建你的代碼時,add會錯誤地將'x_host'和'y_host'解釋爲設備內存指針。 – JackOLantern
你不檢查錯誤。而這種不正確的推理起源於那裏。你的'add'內核運行不正常,但是這個節目繼續下去,因爲直到'cudaMemcpy'都沒有捕獲到錯誤。請查看[this](http://stackoverflow.com/q/14038589/2386951)。 – Farzad