首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >openACC:内存管理

openACC:内存管理
EN

Stack Overflow用户
提问于 2013-05-02 23:31:57
回答 2查看 1.2K关注 0票数 1

我正在使用caps编译器。我想知道有什么东西我可以自己管理记忆吗?

例如,使用CUDA的普通openacc代码是:

代码语言:javascript
复制
 #pragma acc kernels copyin(a,b) copy(c)
  for (i = 0; i < SIZE; ++i)
    for (j = 0; j < SIZE; ++j)
      for (k = 0; k < SIZE; ++k)
        c[i][j] += a[i][k] * b[k][j];

我想要这样的改变

代码语言:javascript
复制
//allocation
cudaMalloc((void**)&a, num_bytes);
cudaMalloc((void**)&b, num_bytes);
cudaMalloc((void**)&c, num_bytes);

//transfer-in
cudaMemcpy(hostA, a, num_bytes, cudaMemcpyHostToDevice);
cudaMemcpy(hostB, b, num_bytes, cudaMemcpyHostToDevice);

//computation
//i think it will be generated as codelet by CAPS openACC compiler.
#pragma acc kernels
  for (i = 0; i < SIZE; ++i)
    for (j = 0; j < SIZE; ++j)
      for (k = 0; k < SIZE; ++k)
        c[i][j] += a[i][k] * b[k][j];

cudaMemcpy(c, hostC, num_bytes, cudaMemcpyDeviceToHost);
cudaFree(&a);cudaFree(&b);cudaFree(&c);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-03 08:03:03

是的,你可以自己分配内存。在您的示例中,应该可以使用device_ptr实用程序来实现这一点,如下所示:

代码语言:javascript
复制
cudaMalloc((void**)&a, num_bytes);
cudaMalloc((void**)&b, num_bytes);
cudaMalloc((void**)&c, num_bytes);

cudaMemcpy(hostA, a, num_bytes, cudaMemcpyHostToDevice);
cudaMemcpy(hostB, b, num_bytes, cudaMemcpyHostToDevice);

#pragma acc data deviceptr(a, b, c)
#pragma acc kernels
  for (i = 0; i < SIZE; ++i)
    for (j = 0; j < SIZE; ++j)
      for (k = 0; k < SIZE; ++k)
        c[i][j] += a[i][k] * b[k][j];

cudaMemcpy(c, hostC, num_bytes, cudaMemcpyDeviceToHost);
cudaFree(a);cudaFree(b);cudaFree(c);

免责声明:用浏览器编写,从未编译或测试过,自带风险使用。

这应该声明abc是对编译器的预先存在的分配.如果您愿意,还应该能够使用OpenACC acc_malloc例程来分配内存而不是cudaMalloc

感谢@user2054656指出我在这个答案的第一个版本中不正确地使用了device_resident

票数 3
EN

Stack Overflow用户

发布于 2013-05-03 09:02:21

我同意魔爪的帖子,除了你应该使用deviceptr子句的data实用主义。我这么说是因为device_resident确实请求OpenACC实现分配内存,而device_ptr没有。您不需要分配内存,因为它已经由用户用cudaMalloc()分配了

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16349400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档