Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >cudaErrorIllegalAdress on cudaMemcpy

cudaErrorIllegalAdress on cudaMemcpy
EN

Stack Overflow用户
提问于 2016-04-08 12:26:59
回答 1查看 1.6K关注 0票数 1

我对cuda很陌生,并试图编写一些代码,这些代码应该会在球面上生成随机点。这是密码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    __global__ 
    void setup_kernel(curandStateMRG32k3a *state) 
    { 
      int id = threadIdx.x + blockIdx.x * blockDim.x;
      curand_init(0, id, 0, &state[id]); 
    }

    __global__
    void computeRandomVectors(float* x, float* y, float* z, unsigned int numberOfElements,curandStateMRG32k3a *state)
    {
      float a,b;
      unsigned int i = blockDim.x * blockIdx.x + threadIdx.x;
      curandStateMRG32k3a localState = state[i];
      if(i < numberOfElements)
        {
          a = curand_uniform(&localState);
          b = curand_uniform(&localState);
          while(a * a + b * b > 1.0f)
        {
          a = curand_uniform(&localState) * 2.0f - 1.0f;
          b = curand_uniform(&localState) * 2.0f - 1.0f;
        }
          x[i] = 2.0f * a * sqrtf(1.0f - a * a - b * b);
          y[i] = 2.0f * b * sqrtf(1.0f - a * a - b * b);
          z[i] = 1.0f - 2.0f * (a * a + b * b);
        }
     }

    void generatePointsOnASphere(thrust::host_vector<float>& h_x,        thrust::host_vector<float>& h_y, thrust::host_vector<float>& h_z)
    {
      if(h_x.size() != h_y.size() && h_x.size() != h_z.size())
        {
          std::cout << "The three component vectors have unmatching  size()" << std::endl;
          return;
        }

      size_t size = h_x.size() * sizeof(float);

      float* h_p_x = (float*) calloc(h_x.size(),sizeof(float));
      float* h_p_y = (float*) calloc(h_x.size(),sizeof(float));
      float* h_p_z = (float*) calloc(h_x.size(),sizeof(float));
      if(h_p_x==NULL || h_p_y==NULL || h_p_z==NULL)
        {
          std::cout << "Host memory allocation failure" << std::endl;
           return;
         }

      float* d_p_x;
      float* d_p_y;
      float* d_p_z;

    if(cudaMalloc((void **)&d_p_x,size) != cudaSuccess || 
     cudaMalloc((void **)&d_p_y,size) != cudaSuccess ||
     cudaMalloc((void **)&d_p_z,size) != cudaSuccess)
    {
      std::string errorString(cudaGetErrorName(cudaGetLastError()));
      std::cout << errorString << std::endl;
      std::cout << "Device memory allocation failure" << std::endl;
      return;
    }
    curandStateMRG32k3a *devStates;
    if(cudaMalloc((void **)&devStates, h_x.size() * sizeof(curandStateMRG32k3a)) != cudaSuccess)
    {
      std::string errorString(cudaGetErrorName(cudaGetLastError()));
      std::cout << errorString << std::endl;
      std::cout << "Random generator states memory allocation failure" << std::endl;
      return;
    }

  int threads = 256;
  dim3 grid = size / threads;
  setup_kernel<<<grid,threads>>>(devStates);

  if(cudaMemcpy(d_p_x,h_p_x,size,cudaMemcpyHostToDevice) != cudaSuccess ||
     cudaMemcpy(d_p_y,h_p_y,size,cudaMemcpyHostToDevice) != cudaSuccess ||
     cudaMemcpy(d_p_z,h_p_z,size,cudaMemcpyHostToDevice) != cudaSuccess)
    {
      std::string errorString(cudaGetErrorName(cudaGetLastError()));
      std::cout << errorString << std::endl;
      std::cout <<  "Host to Device memory copy failure" << std::endl;
    }

  computeRandomVectors<<< grid, threads >>>(d_p_x,d_p_y,d_p_z,size / sizeof(float), devStates);

  if(cudaMemcpy(h_p_x,d_p_x,size,cudaMemcpyDeviceToHost) != cudaSuccess ||
     cudaMemcpy(h_p_y,d_p_y,size,cudaMemcpyDeviceToHost) != cudaSuccess ||
     cudaMemcpy(h_p_z,d_p_z,size,cudaMemcpyDeviceToHost) != cudaSuccess)
    {
      std::string errorString(cudaGetErrorName(cudaGetLastError()));
      std::cout << errorString << std::endl;      
      std::cout <<  "Device to Host memory copy failure" << std::endl;
    }
  for(size_t i = 0; i < h_x.size(); ++i)
    {
      h_x[i] = h_p_x[i];
      h_y[i] = h_p_y[i];
      h_z[i] = h_p_z[i];
    }

  free (h_p_x);
  free (h_p_y);
  free (h_p_z);
  cudaFree (devStates);
  cudaFree (d_p_x);
  cudaFree (d_p_y);
  cudaFree (d_p_z);
  cudaDeviceReset();
}

如果向量中的元素数小于4000 (我尝试了1K、2K、3K和4K),则此代码可以工作。而不是它给了我第一个cudaMemcpy中的非法地址。我认为我没有耗尽内存,我正在使用gtx 980 (4GB的全局内存)。知道怎么解决这个问题吗?

编辑:建议修改后的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
__global__ 
void setup_kernel(curandStateMRG32k3a *state, unsigned int numberOfElements) 
{ 
  int id = threadIdx.x + blockIdx.x * blockDim.x;
  if(id < numberOfElements) curand_init(0, id, 0, &state[id]); 
}

__global__
void computeRandomVectors(float* x, float* y, float* z, unsigned int numberOfElements,curandStateMRG32k3a *state)
{
  float a,b;
  unsigned int i = blockDim.x * blockIdx.x + threadIdx.x;
  curandStateMRG32k3a localState = state[i];
  if(i < numberOfElements)
    {
      a = curand_uniform(&localState);
      b = curand_uniform(&localState);
      while(a * a + b * b > 1.0f)
     {
       a = curand_uniform(&localState) * 2.0f - 1.0f;
       b = curand_uniform(&localState) * 2.0f - 1.0f;
     }
      x[i] = 2.0f * a * sqrtf(1.0f - a * a - b * b);
      y[i] = 2.0f * b * sqrtf(1.0f - a * a - b * b);
      z[i] = 1.0f - 2.0f * (a * a + b * b);
     }
 }

 void generatePointsOnASphere(thrust::host_vector<float>& h_x, thrust::host_vector<float>& h_y, thrust::host_vector<float>& h_z)
 {
  if(h_x.size() != h_y.size() && h_x.size() != h_z.size())
    {
      std::cout << "The three component vectors have unmatching size()" << std::endl;
      return;
    }

   size_t size = h_x.size() * sizeof(float);

   float* h_p_x = (float*) calloc(h_x.size(),sizeof(float));
   float* h_p_y = (float*) calloc(h_x.size(),sizeof(float));
   float* h_p_z = (float*) calloc(h_x.size(),sizeof(float));
   if(h_p_x==NULL || h_p_y==NULL || h_p_z==NULL)
    {
      std::cout << "Host memory allocation failure" << std::endl;
      return;
    }

   float* d_p_x;
   float* d_p_y;
   float* d_p_z;

   if(cudaMalloc((void **)&d_p_x,size) != cudaSuccess || 
 cudaMalloc((void **)&d_p_y,size) != cudaSuccess ||
 cudaMalloc((void **)&d_p_z,size) != cudaSuccess)
    {
      std::string errorString(cudaGetErrorName(cudaGetLastError()));
      std::cout << errorString << std::endl;
      std::cout << "Device memory allocation failure" << std::endl;
      return;
     }
  curandStateMRG32k3a *devStates;
  if(cudaMalloc((void **)&devStates, h_x.size() * sizeof(curandStateMRG32k3a)) != cudaSuccess)
    {
      std::string errorString(cudaGetErrorName(cudaGetLastError()));
      std::cout << errorString << std::endl;
      std::cout << "Random generator states memory allocation failure" << std::endl;
      return;
    }

  if(cudaMemcpy(d_p_x,h_p_x,size,cudaMemcpyHostToDevice) != cudaSuccess ||
 cudaMemcpy(d_p_y,h_p_y,size,cudaMemcpyHostToDevice) != cudaSuccess ||
 cudaMemcpy(d_p_z,h_p_z,size,cudaMemcpyHostToDevice) != cudaSuccess)
    {
      std::string errorString(cudaGetErrorName(cudaGetLastError()));
      std::cout << errorString << std::endl;
      std::cout <<  "Host to Device memory copy failure" << std::endl;
     }

  int threads = 512;
  dim3 grid = (h_x.size() + threads - 1) / threads;
  setup_kernel<<<grid,threads>>>(devStates, size / sizeof(float));
  computeRandomVectors<<< grid, threads >>>(d_p_x,d_p_y,d_p_z,size / sizeof(float), devStates);
  cudaDeviceSynchronize();
  if(cudaMemcpy(h_p_x,d_p_x,size,cudaMemcpyDeviceToHost) != cudaSuccess ||
 cudaMemcpy(h_p_y,d_p_y,size,cudaMemcpyDeviceToHost) != cudaSuccess ||
 cudaMemcpy(h_p_z,d_p_z,size,cudaMemcpyDeviceToHost) != cudaSuccess)
    {
      std::string errorString(cudaGetErrorName(cudaGetLastError()));
      std::cout << errorString << std::endl;      
      std::cout <<  "Device to Host memory copy failure" << std::endl;
    }
  for(size_t i = 0; i < h_x.size(); ++i)
    {
      h_x[i] = h_p_x[i];
      h_y[i] = h_p_y[i];
      h_z[i] = h_p_z[i];
    }

  free (h_p_x);
  free (h_p_y);
  free (h_p_z);
  cudaFree (devStates);
  cudaFree (d_p_x);
  cudaFree (d_p_y);
  cudaFree (d_p_z);
  cudaDeviceReset();
}

我很抱歉继续在这里发帖,但我想通过理解我现在的错误,我想我可能会对库达有一个更好的理解。现在,当errorIllegalAdress ()为20k时,我在cudaMemcpy设备上获得了h_x.size->host。我仍然不明白代码是如何工作的小数字,但不是大数字。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-08 13:50:22

问题在于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  size_t size = h_x.size() * sizeof(float);

  ...
  int threads = 256;
  dim3 grid = size / threads;

您的size变量按字节数进行缩放。因此,这不是用于网格大小的正确变量。您应该像这样计算网格大小:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  dim3 grid = h_x.size() / threads;

或者类似的。还请注意,除非向量长度(h_x.size())可被threads (即256 )均匀整除,否则这个构造不会正确地初始化所有curand状态。解决这个问题的方法是在setup_kernel中包含一个线程检查,类似于另一个内核中的线程检查:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
__global__ 
void setup_kernel(curandStateMRG32k3a *state, int size) 
{ 
  int id = threadIdx.x + blockIdx.x * blockDim.x;
  if (id < size)
    curand_init(0, id, 0, &state[id]); 
}

并启动足够多的线程来覆盖向量大小:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  dim3 grid = (h_x.size()+threads-1) / threads;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36508747

复制
相关文章
C++模板扩展
第一个参数是类型,决定数组的类型,第二个是非类型,决定数组的容量。 这个容器可以对于数组下标是否越界进行检查,而C语言当中的数组是进行抽查。
有礼貌的灰绅士
2023/03/28
4400
C++模板扩展
Django 继承AbstractUser扩展用户模型
https://www.djangoproject.com/download/2.0.13/tarball/
授客
2020/11/13
1.6K0
Django 继承AbstractUser扩展用户模型
你的基因里,写着祖父母过去的经历
19 世纪,“遗传”首次被作为一个科学问题提了出来,达尔文(Charles Darwin)们想要知道:一代人传给下一代的到底是什么。20 世纪初,基因第一次进入研究人员的视野,现有的生命如何与他们的祖先产生联系?基因给了他们答案。
巴法
2019/09/29
4840
你的基因里,写着祖父母过去的经历
最长回文子串 (中心扩展)
题目描述 给你一个字符串 s,找到 s 中最长的回文子串。 示例 输入: s = “babad” 输出: “bab” 解释: “aba” 同样是符合题意的答案。 提示: 1 <= s.length <= 1000 s 仅由数字和英文字母组成 题解 中心扩展法 由子串的中心向两边展开,也就是模拟双指针 从当前位置向左寻找与当前位置相同的字符,然后 left - - ,直到找不到。 然后从当前位置向右寻找与当前位置相同的字符,然后right++,直到找不到。 以当前位置的两端开始向左右扩散,寻找左边是否等于右
且陶陶
2023/04/12
2630
最长回文子串 (中心扩展)
再看包括、扩展和泛化、继承
我们知道包括和扩展是用例图中所特有的关系,而泛化和继承则不仅用于用例图,同一时候也适用于其它图,如类图。这两对概念相信对于学习面向对象中的我们来说是非常easy混淆的,非常多时候自己都不知道包括和扩展箭头究竟该指向哪里,是虚线还是实线,泛化究竟跟继承什么关系?常常为此大家争
全栈程序员站长
2022/07/12
1.4K0
再看包括、扩展和泛化、继承
欧几里得扩展模板--------------------------C语言——菜鸟级
用于求 ax+by=c 的解 #include<stdio.h> int x0,y0; int oujdk(int a,int b) { if(b==0) { x0=1; y0=0; return a; } int t=oujdk(b,a%b); int w=x0; x0=y0; y0=w-a/b*y0; return t; } int main() { int x,y,t,l,m,n,a,b,r; scanf(
Fivecc
2022/11/21
3760
CLI子命令扩展-插件机制实现
本文作者:ivweb 程柳锋 开发CLI工具过程中,为了便于扩展,将CLI的实现分为基础功能和扩展功能。基础功能包括init、build、lint、publish等伴随工程从初始化到最终发布到生产
腾讯IVWEB团队
2017/09/29
1.4K0
CLI子命令扩展-插件机制实现
django 使用邮箱登录(扩展用户表、继承 AbstractUser)
# apps/users/views.py(不局限于邮箱,也可以改成 手机号码等等,但是要注意字符类型)
卓越笔记
2023/02/18
7920
LeetCode 647. 回文子串(DP/中心扩展)
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
Michael阿明
2020/07/13
5930
模板继承
使用模板继承可以将网站HTML骨架抽离到单独的文件中,其他页面模板可以继承骨架文件。
Qwe7
2022/05/23
3210
Hexo主题(EJS模板)自定义页面扩展
自从初次接触 Hexo 到现在已经有两年多的时间了,时间过得飞快啊,关于 Hexo 的优点不再赘述,关于个人站点的优点,有必要在强调一下,那就是极高的自由度,这也是这篇文章的基础。现在有时间刚好总结一下我对于 Hexo 做的一些自定义扩展,虽然之前可能在别的文章中或多或少的涉及了,但并没有统一整理过。
ZONGLYN
2019/12/24
2.3K0
Hexo主题(EJS模板)自定义页面扩展
【Kotlin】扩展函数 ③ ( 定义扩展文件 | 重命名扩展函数 | Kotlin 标准库扩展函数 )
如果定义的 扩展函数 需要在 多个 Kotlin 代码文件 中使用 , 则需要在 单独的 Kotlin 文件 中定义 , 该文件被称为 扩展文件 ;
韩曙亮
2023/03/30
1.3K0
【Kotlin】扩展函数 ③ ( 定义扩展文件 | 重命名扩展函数 | Kotlin 标准库扩展函数 )
【Kotlin】扩展函数总结 ★ ( 超类扩展函数 | 私有扩展函数 | 泛型扩展函数 | 扩展属性 | 定义扩展文件 | infix 关键字用法 | 重命名扩展函数 | 标准库扩展函数 )
为 现有类 定义 扩展函数 , 可以在 不修改 原有类 的情况下 增加类的功能 ;
韩曙亮
2023/03/30
2.9K0
【Kotlin】扩展函数总结 ★ ( 超类扩展函数 | 私有扩展函数 | 泛型扩展函数 | 扩展属性 | 定义扩展文件 | infix 关键字用法 | 重命名扩展函数 | 标准库扩展函数 )
soapclient php 扩展,PHP扩展—SOAP[通俗易懂]
SOAP扩展可以用于编写SOAP服务器和客户端,支持 SOAP 1.1, SOAP 1.2 和 WSDL 1.1 规格的子集。
全栈程序员站长
2022/11/16
1.9K0
【Groovy】Groovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )
在上一篇博客 【Groovy】Groovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy 中 Thread 类的 start 扩展方法 ) 中 , 分析 Thread 的扩展方法 start 方法 , 该方法调用如下 ,
韩曙亮
2023/03/30
9730
【Groovy】Groovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )
活着辛辛苦苦996,死后房子归政府。。。
新粉请关注我的公众号 在北京丰台区,有一个38岁的杨某,根据披露的信息,他父母双亡、未婚、无子女,也没有兄弟姐妹、祖父。 也就是说,他去世之前很久的一段时间,大概率都是在独居。 2014年底的时候,他在丰台区买了一套房子,当时这个房子的总价是115万,他从公积金贷款了80万。 2016年杨某去世以后,留下最值钱的东西就是这套房产了,北京14年115万的房子,到现在应该价值在300万+。 前面也提到了,杨某几乎没有亲属可以继承这个遗产,而他自己也没有立遗嘱,这套房子就成为了一个争议点。 他的舅舅曾一度以为自己
用户1564362
2022/05/12
3380
活着辛辛苦苦996,死后房子归政府。。。
什么是横向扩展和纵向扩展?
现代应用程序不断变化,随着新要求的发展而发展,并且存在于对资源的不同需求的环境中。扩展应用程序可以根据资源需求适当调整其大小,以确保客户满意并降低基础设施成本。
后场技术
2022/04/15
4.8K0
什么是横向扩展和纵向扩展?
【jfinal】扩展JFIANL 支持加载jar包中SQL模板
扩展 ActiveRecordPlugin 支持加载jar包中SQL模板 jfinal3.1 中新增了IStringSource ,这个接口方便大家扩展SQL模块的加载方式, 下面我说的场景是把sql模板打在jar包中进行扫描的情况。多模块项目请参考 http://git.oschina.net/log4j/LMS /** * Created by jie on 2017/4/21. * 扫描jar中的sql文件 */ public class ScanJarStringSource impleme
冷冷
2018/02/08
8180
jsp模板继承
jsp通过自定义标签实现类似模板继承的效果 关于标签的定义、注册、使用在上面文章均以一个自定义时间的标签体现,如有不清楚自定义标签流程的话请参考这篇文章 http://www.cnblogs.com/zhuchenglin/p/8109787.html 关于jsp 的模板继承 请参考 这篇文章,上面的使用方法非常清楚,这里就不再说明 自定义标签实现类似模板继承的效果 参考 下面来看一下我的代码: 1. 在新建包 com.xiangmu.tags 中新建两个类,一个是 BlockTag.java,另一
lin_zone
2018/08/15
2.1K0
python扩展
补充一些有趣的知识 1. sys模块方法的补充,打印进度条 import sys,time for i in range(20): sys.stdout.write("#") sys.stdout.flush() time.sleep(0.1)  2. 实现简单的shell sed替换功能 import sys res = sys.argv print(res) #命令行参数,在Terminal输入命令:python update_flie.py ,res接收到的结果为list
py3study
2020/01/16
9070
python扩展

相似问题

使用模板化继承调用祖父母构造函数

12

子类不继承祖父母属性

20

Java泛型。子扩展父母

17

继承-获取基本类型祖父母

15

如何从祖父母标签继承css?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文