Cuda openACC:内存管理

Cuda openACC:内存管理,cuda,openacc,Cuda,Openacc,我正在使用caps openacc编译器。我想知道我能自己管理内存吗 例如,使用CUDA的常规openacc代码为: #pragma acc内核copyin(a,b)copy(c) 对于(i=0;i

我正在使用caps openacc编译器。我想知道我能自己管理内存吗

例如,使用CUDA的常规openacc代码为:

#pragma acc内核copyin(a,b)copy(c)
对于(i=0;i
我想要这样的变化

//分配
cudamaloc((void**)和a,num_字节);
cudamaloc((void**)和b,num_字节);
cudamaloc((void**)和c,num_字节);
//转入
cudaMemcpy(hostA,a,num_字节,cudaMemcpyHostToDevice);
cudaMemcpy(hostB,b,num_字节,cudaMemcpyHostToDevice);
//计算
//我认为它将由CAPS openACC编译器生成为codelet。
#pragma-acc核
对于(i=0;i
是的,您可以自己分配内存。在您的示例中,应该可以使用
设备\u ptr
pragma实现这一点,例如:

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);
cudamaloc((void**)和a,num_字节);
cudamaloc((void**)和b,num_字节);
cudamaloc((void**)和c,num_字节);
cudaMemcpy(hostA,a,num_字节,cudaMemcpyHostToDevice);
cudaMemcpy(hostB,b,num_字节,cudaMemcpyHostToDevice);
#pragma acc数据设备(a、b、c)
#pragma-acc核
对于(i=0;i
[免责声明:在浏览器中编写,从未编译或测试,使用风险自负]

这应该声明
a
b
c
是对编译器预先存在的分配。如果您愿意,您还应该能够使用OpenACC
acc\u malloc
例程来分配内存,以代替
cudamaloc


感谢@user2054656指出我在本答案的第一个版本中不正确地使用了
device\u-resident

是的,您可以自己分配内存。在您的示例中,应该可以使用
设备\u ptr
pragma实现这一点,例如:

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);
cudamaloc((void**)和a,num_字节);
cudamaloc((void**)和b,num_字节);
cudamaloc((void**)和c,num_字节);
cudaMemcpy(hostA,a,num_字节,cudaMemcpyHostToDevice);
cudaMemcpy(hostB,b,num_字节,cudaMemcpyHostToDevice);
#pragma acc数据设备(a、b、c)
#pragma-acc核
对于(i=0;i
[免责声明:在浏览器中编写,从未编译或测试,使用风险自负]

这应该声明
a
b
c
是对编译器预先存在的分配。如果您愿意,您还应该能够使用OpenACC
acc\u malloc
例程来分配内存,以代替
cudamaloc


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

我同意talonmies的帖子,除了你应该使用
数据的
deviceptr
子句。我这样说是因为,
device\u-resident
确实请求OpenACC实现分配内存,而device\u-ptr没有。
您不需要分配内存,因为它已经由用户使用
cudamaloc()

分配了。我同意talonmies的帖子,只是您应该使用
data
pragma的
deviceptr
子句。我这样说是因为,
device\u-resident
确实请求OpenACC实现分配内存,而device\u-ptr没有。
您不需要分配内存,因为它已经由用户使用
cudamaloc()

分配了。感谢您的更正,当我写答案时,我是在火车上从内存发布的,并且得到了
设备驻留的意图。
错误…感谢您的更正,当我写下我的答案时,我正在一列火车上发帖,结果发现
device\u-resident
的意图错了。。。
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);