【发布时间】:2014-09-28 04:19:23
【问题描述】:
我正在尝试在 __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运行您的代码。如果您按照here 所述进行 cuda 错误检查,您将得到更明确的指示,表明问题出在内核上。 -
谢谢@RobertCrovella。确实,我的内核似乎有问题;见pastebin.com/AW9vmjFs。在调用
cudaMemcpyToSymbol之前需要分配DEV_X 吗?我无法弄清楚问题可能是什么......