cudaMemcpy 无效参数:在简单向量示例中
cudaMemcpy invalid argument: in simple vector example
下面的例子:
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#include <cuda.h>
#include <math.h>
#define N 100
#define t_num 256
int main(){
int vector_one_h[t_num], vector_one_g[t_num];
cudaError_t err = cudaMalloc((void**)&vector_one_g, t_num * sizeof(int));
printf("Cuda malloc vector swap one: %s \n", cudaGetErrorString(err));
printf("Device Vector: %p \n:" , vector_one_g);
for(int m = 0; m < t_num; m++){
vector_one_h[m] = rand() % N;
}
err = cudaMemcpy(vector_one_g, vector_one_h, t_num * sizeof(int), cudaMemcpyHostToDevice);
printf("Cuda mem copy vector swap one: %s \n", cudaGetErrorString(err));
}
会 return:
Cuda malloc vector swap one: no error
Device Vector: 0x7ffcf028eea0
:Cuda mem copy vector swap one: invalid argument
那么为什么 cudaMemcpy 收到无效参数?
根据 cudaMemcpy()
here 的文档,我认为问题可能是我需要将第二个参数作为地址 &vector_one_h
,但将其放在代码中 return完全相同的错误。
而且,虽然有很多关于 cudaMemcpy
无效参数的帖子,但我相信这不是重复的,因为大多数其他问题都有非常复杂的例子,而这是一个非常简单和最小的例子。
尝试将第一行更改为:
int vector_one_h[t_num], *vector_one_g;
顺便说一句,在数组名称前加上 & 没有任何效果。根据 C 语法的定义,数组名称本身就是常量指针。
下面的例子:
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#include <cuda.h>
#include <math.h>
#define N 100
#define t_num 256
int main(){
int vector_one_h[t_num], vector_one_g[t_num];
cudaError_t err = cudaMalloc((void**)&vector_one_g, t_num * sizeof(int));
printf("Cuda malloc vector swap one: %s \n", cudaGetErrorString(err));
printf("Device Vector: %p \n:" , vector_one_g);
for(int m = 0; m < t_num; m++){
vector_one_h[m] = rand() % N;
}
err = cudaMemcpy(vector_one_g, vector_one_h, t_num * sizeof(int), cudaMemcpyHostToDevice);
printf("Cuda mem copy vector swap one: %s \n", cudaGetErrorString(err));
}
会 return:
Cuda malloc vector swap one: no error
Device Vector: 0x7ffcf028eea0
:Cuda mem copy vector swap one: invalid argument
那么为什么 cudaMemcpy 收到无效参数?
根据 cudaMemcpy()
here 的文档,我认为问题可能是我需要将第二个参数作为地址 &vector_one_h
,但将其放在代码中 return完全相同的错误。
而且,虽然有很多关于 cudaMemcpy
无效参数的帖子,但我相信这不是重复的,因为大多数其他问题都有非常复杂的例子,而这是一个非常简单和最小的例子。
尝试将第一行更改为:
int vector_one_h[t_num], *vector_one_g;
顺便说一句,在数组名称前加上 & 没有任何效果。根据 C 语法的定义,数组名称本身就是常量指针。