Cuda openACC:内存管理
我正在使用caps openacc编译器。我想知道我能自己管理内存吗 例如,使用CUDA的常规openacc代码为:Cuda openACC:内存管理,cuda,openacc,Cuda,Openacc,我正在使用caps openacc编译器。我想知道我能自己管理内存吗 例如,使用CUDA的常规openacc代码为: #pragma acc内核copyin(a,b)copy(c) 对于(i=0;i
#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
是对编译器预先存在的分配。如果您愿意,您还应该能够使用OpenACCacc\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
是对编译器预先存在的分配。如果您愿意,您还应该能够使用OpenACCacc\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);