我試圖在__device__
變量,其中,根據規格,駐留「在全球記憶」應用內核函數cudaMemcpyFromSymbol在__device__變量
#include <stdio.h>
#include "sys_data.h"
#include "my_helper.cuh"
#include "helper_cuda.h"
#include <cuda_runtime.h>
double X[10] = {1,-2,3,-4,5,-6,7,-8,9,-10};
double Y[10] = {0};
__device__ double DEV_X[10];
int main(void) {
checkCudaErrors(cudaMemcpyToSymbol(DEV_X, X,10*sizeof(double)));
vector_projection<double><<<1,10>>>(DEV_X, 10);
getLastCudaError("oops");
checkCudaErrors(cudaMemcpyFromSymbol(Y, DEV_X, 10*sizeof(double)));
return 0;
}
內核功能vector_projection
在my_helper.cuh
定義爲如下:
template<typename T> __global__ void vector_projection(T *dx, int n) {
int tid;
tid = threadIdx.x + blockIdx.x * blockDim.x;
if (tid < n) {
if (dx[tid] < 0)
dx[tid] = (T) 0;
}
}
正如你所看到的,我用cudaMemcpyToSymbol
和cudaMemcpyFromSymbol
傳輸數據和從設備。不過,我發現了以下錯誤:
CUDA error at ../src/vectorAdd.cu:19 code=4(cudaErrorLaunchFailure)
"cudaMemcpyFromSymbol(Y, DEV_X, 10*sizeof(double))"
腳註:我當然可以迴避使用__device__
變量和去的東西like this的正常工作;我只想看看如何用__device__
變量做同樣的事情(如果可能的話)。
更新:cuda-memcheck
的輸出可以在http://pastebin.com/AW9vmjFs找到。是錯誤消息我得到如下:
========= Invalid __global__ read of size 8
========= at 0x000000c8 in /home/ubuntu/Test0001/Debug/../src/my_helper.cuh:75:void vector_projection<double>(double*, int)
========= by thread (9,0,0) in block (0,0,0)
========= Address 0x000370e8 is out of bounds
您的'vector_projection'內核在執行期間失敗。你的'getLastCudaError'調用會捕獲一些類型的內核問題。其他人可能不會出現,直到下一個同步點,這將是'cudaMemcpyFromSymbol'。文檔指出這些調用可以返回以前異步活動的錯誤。嘗試用'cuda-memcheck'運行你的代碼。如果你做cuda錯誤檢查[概述] [這裏](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime- api)你會得到一個更明確的指示,說明問題出在內核上。 – 2014-09-27 15:13:52
謝謝@RobertCrovella。事實上,我的內核似乎存在一個問題。請參閱http://pastebin.com/AW9vmjFs。在我調用'cudaMemcpyToSymbol'之前,我需要分配DEV_X嗎?我無法弄清楚問題可能是什麼...... – 2014-09-27 15:21:55