私が持っている2つのcudaデバイスを利用しようとしています(実際には2つの別々のデバイスであるGF 690GTXで実験しています)、プログラムは定数メモリを使用してデータをデバイスに転送します。
グローバル メモリを 2 つのデバイスで使用するには、どうすればよいかを明確に理解しています。
//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);
しかし、定数メモリを使用する場合、それを使用する通常の方法は、ファイル内のどこかで定数変数を宣言し、「シンボル」関数を使用してそれを操作することです。
// What device this memory is on?
__device__ __constant__ float g_const_memory[CONST_MEM_SIZE];
// dev_func can be told to be called on any device
__global__ void dev_func()
{
//using const memory
float f = g_const_memory[const_index];
}
void host_func()
{
//cudaSetDevice(0); //any sense?
cudaMemcpyToSymbol(g_const_memory, host_mem, ...);
dev_func<<<...>>>();
}
この質問をする前にグーグルで検索しましたが、答えが見つかりませんでした。本当に仕方がないのでしょうか?