CUDA程序报错 invalid argument 30
以下是主程序matrix.cu#include<stdio.h>#include<stdlib.h>#include<string.h>#include<cuda_run...
以下是主程序matrix.cu
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include<cuda_runtime.h>
#include<math.h>
#include <cutil_inline.h>
#include "mapping.cu"
#define N (1920*1080*3)
int main(void){
char hst_output[N];
char dev_output[N];
cutilSafeCall(cudaMalloc((void**)&hst_output,N*sizeof(char)));
cutilSafeCall(cudaMalloc((void**)&dev_output,N*sizeof(char)));
dim3 dimBlock(8, 8, 1); //申明线程块大小
dim3 dimGrid(240, 135*3, 1); //申明线程格大小
Mapping<<<dimBlock,dimGrid>>>(dev_output);
cutilSafeCall( cudaThreadSynchronize() );
cutilSafeCall(cudaMemcpy(hst_output,dev_output,N*sizeof(char),cudaMemcpyDeviceToHost));
return 0;
}
以下是核函数文件
#define N_VIEWS 28
#define TAN_A 0.166667
#define N_PIXEL 9.333333
#define width 3240
__global__ void Mapping(char* output)
{
int x= blockIdx.x * blockDim.x + threadIdx.x;
int y= blockIdx.y * blockDim.y + threadIdx.y;
int res;
double k,m;
k= x+3.0*y*TAN_A;
m=fmod(k,N_PIXEL);
res=(int)(m/N_PIXEL*N_VIEWS+0.5);
if(res == N_VIEWS)
{
res=0;
}
res = N_VIEWS-1-res;
if(res>=N_VIEWS || res<0)
{
getchar();
}
output[y*width+x]=(char)res;
}
该程序的目的是生成一个1920*1080*3的一个映射表。根据xy坐标可以直接计算出矩阵元素的值。(涉及到实际工程核函数计算公式比较复杂但不存在问题,看的时候可以忽略)
本程序运行的问题是运行时如下报错
cudaSafeCall() Runtime API error in file...../matrix.cu,line 20: invalid argument
错误指向了matrix.cu的
cutilSafeCall(cudaMemcpy(hst_output,dev_output,N*sizeof(char),cudaMemcpyDeviceToHost));
GOOGLE上搜索了许多方案始终不懂,有可能的错误时host 和 Device之间的指针错误?或者是定义数组过大溢出?求大神指教! 展开
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include<cuda_runtime.h>
#include<math.h>
#include <cutil_inline.h>
#include "mapping.cu"
#define N (1920*1080*3)
int main(void){
char hst_output[N];
char dev_output[N];
cutilSafeCall(cudaMalloc((void**)&hst_output,N*sizeof(char)));
cutilSafeCall(cudaMalloc((void**)&dev_output,N*sizeof(char)));
dim3 dimBlock(8, 8, 1); //申明线程块大小
dim3 dimGrid(240, 135*3, 1); //申明线程格大小
Mapping<<<dimBlock,dimGrid>>>(dev_output);
cutilSafeCall( cudaThreadSynchronize() );
cutilSafeCall(cudaMemcpy(hst_output,dev_output,N*sizeof(char),cudaMemcpyDeviceToHost));
return 0;
}
以下是核函数文件
#define N_VIEWS 28
#define TAN_A 0.166667
#define N_PIXEL 9.333333
#define width 3240
__global__ void Mapping(char* output)
{
int x= blockIdx.x * blockDim.x + threadIdx.x;
int y= blockIdx.y * blockDim.y + threadIdx.y;
int res;
double k,m;
k= x+3.0*y*TAN_A;
m=fmod(k,N_PIXEL);
res=(int)(m/N_PIXEL*N_VIEWS+0.5);
if(res == N_VIEWS)
{
res=0;
}
res = N_VIEWS-1-res;
if(res>=N_VIEWS || res<0)
{
getchar();
}
output[y*width+x]=(char)res;
}
该程序的目的是生成一个1920*1080*3的一个映射表。根据xy坐标可以直接计算出矩阵元素的值。(涉及到实际工程核函数计算公式比较复杂但不存在问题,看的时候可以忽略)
本程序运行的问题是运行时如下报错
cudaSafeCall() Runtime API error in file...../matrix.cu,line 20: invalid argument
错误指向了matrix.cu的
cutilSafeCall(cudaMemcpy(hst_output,dev_output,N*sizeof(char),cudaMemcpyDeviceToHost));
GOOGLE上搜索了许多方案始终不懂,有可能的错误时host 和 Device之间的指针错误?或者是定义数组过大溢出?求大神指教! 展开
2个回答
展开全部
cudaMemcpy(hst_output,dev_output,N*sizeof(char),cudaMemcpyDeviceToHost)中的hst_output不应该在GPU设备上开辟空间,即不需要这样开辟空间:cutilSafeCall(cudaMalloc((void**)&hst_output,N*sizeof(char)));
直接在主机上开辟hst_output的空间,这样cudaMemcpyDeviceToHost才能成功从GPU的存储空间中把数据复制到主机的存储空间
直接在主机上开辟hst_output的空间,这样cudaMemcpyDeviceToHost才能成功从GPU的存储空间中把数据复制到主机的存储空间
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询