Memory 如何在多个cuda设备上使用恒定内存

Memory 如何在多个cuda设备上使用恒定内存,memory,cuda,constants,device,Memory,Cuda,Constants,Device,我试图利用我拥有的两个cuda设备(我现在正在试验GF 690GTX,它实际上是两个独立的设备),我的程序使用恒定内存将数据传输到设备 我清楚地了解如何使用全局内存在两个设备中使用它: //使用设备0 cudaSetDevice(0); void*mem_on_dev_0=cudamaloc(…); cudaMemcpy(mem_on_dev_0,mem_on_host,…); 内核调用(mem_on_dev_0); //使用设备1 cudaSetDevice(1); void*mem_on_

我试图利用我拥有的两个cuda设备(我现在正在试验GF 690GTX,它实际上是两个独立的设备),我的程序使用恒定内存将数据传输到设备

我清楚地了解如何使用全局内存在两个设备中使用它:

//使用设备0
cudaSetDevice(0);
void*mem_on_dev_0=cudamaloc(…);
cudaMemcpy(mem_on_dev_0,mem_on_host,…);
内核调用(mem_on_dev_0);
//使用设备1
cudaSetDevice(1);
void*mem_on_dev_1=cudamaloc(…);
cudaMemcpy(mem_on_dev_1,mem_on_host,…);
内核调用(mem_on_dev_1);
但在使用常量内存时,通常的使用方法是在文件中的某个位置声明常量变量,然后使用“Symbol”-函数来使用它:

//此内存位于哪个设备上?
__设备常量浮点常量内存[常量内存大小];
//可以告诉dev_func在任何设备上调用
__全局无效开发函数()
{
//使用常量内存
浮点f=g_常量_内存[常量索引];
}
void host_func()
{
//cudaSetDevice(0);//有意义吗?
CUDAMEMCPITOSYMBOL(g_const_memory,host_mem,…);
dev_func();
}

在问这个问题之前,我在谷歌上搜索了很多,但没有找到任何答案。真的没有办法吗?

在您的第一个代码段中,将CUDAMEMCPITOSYMBOL添加到cudaSetDevice(0)和cudaSetDevice(1)部分。每个设备都有一个CUmodule的副本。当您调用CUDAMEMCPITOSYMBOL时,它将根据活动设备查找符号。我在前面的stackoverflow问题中回答了更详细的问题,但我找不到该问题。虽然它与您的问题无关,但您在Cudamaloc的第一个代码部分中描述的语法不正确。Cudamaloc不会返回您可以按照建议分配的指针。相反,指针必须在函数参数中通过引用传递。@GregSmith,非常感谢。它起作用了@RobertCrovella,你肯定是对的。@GregSmith:你确定cudaMemcpyToSymbol()对cudaSetDevice()有响应吗?在年,OP可以通过为每张卡使用一个单独的
\uuuuu常量\uuuuuu
来修复他的应用程序。
//working with device 0
cudaSetDevice(0);
void* mem_on_dev_0 = cudaMalloc(...);
cudaMemcpy(mem_on_dev_0, mem_on_host, ...);
kernel_call<<<...>>>(mem_on_dev_0);

//working with device 1
cudaSetDevice(1);
void* mem_on_dev_1 = cudaMalloc(...);
cudaMemcpy(mem_on_dev_1, mem_on_host, ...);
kernel_call<<<...>>>(mem_on_dev_1);