[英]On CUDA __constant__ memory and multi-GPUs?
在共享內存編程模型中,任何全局變量對於每個線程都是可見的。
在CUDA中,以類似方式聲明的常量內存,例如共享內存系統中的全局變量,這讓我有些擔心:
考慮以下代碼:
__constant__ int array[1024];
void hostFunction(int DeviceID, cudaStream_t streamIdx)
{
cudaSetDevice(DeviceID);
someKernel<<<100,1024,0, streamIdx>>>(...);
//The function someKernel will use data stored in array[] on current device;
};
然后, array[]
的內容是否在每個cuda上下文/設備本地,以便我們可以安全地更新每個設備的“私有” array[]
而不必擔心更改在其他cuda設備上分配的array[]
的值?
順便說一句:我在網站上搜索了一些相關問題,但是從這些問題中我都找不到明確的答案。
然后,array []的內容是否在每個cuda上下文/設備本地,以便我們可以安全地更新每個設備的“私有” array []而不必擔心更改在其他cuda設備上分配的array []的值?
是的,單行代碼
__constant__ int array[1024];
在程序訪問的每個設備上創建一個分配。
然后,您可以使用以下命令分別在每個設備上加載__constant__
內存:
cudaSetDevice(0);
cudaMemcpyToSymbol(array, my_device_0_constant_data, 1024*sizeof(int));
並對您要使用的每個設備重復以上操作。
可以對__device__
變量做出類似的陳述。
這是一個完整的示例:
$ cat t223.cu
#include <stdio.h>
#define cudaCheckErrors(msg) \
do { \
cudaError_t __err = cudaGetLastError(); \
if (__err != cudaSuccess) { \
fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
msg, cudaGetErrorString(__err), \
__FILE__, __LINE__); \
fprintf(stderr, "*** FAILED - ABORTING\n"); \
exit(1); \
} \
} while (0)
__constant__ int my_const_data;
__device__ int my_dev_data;
__global__ void my_kernel(int my_dev){
printf("device %d constant data is: %d\n", my_dev, my_const_data);
printf("device %d __device__ data is: %d\n", my_dev, my_dev_data);
}
int main(){
int num_dev = 0;
cudaGetDeviceCount(&num_dev);
cudaCheckErrors("get device count fail");
if (num_dev == 0) {printf("no cuda devices found!\n"); return 1;}
for (int i = 0; i < num_dev; i++){
int cdata = i;
int ddata = 10*i;
cudaSetDevice(i);
cudaMemcpyToSymbol(my_const_data, &cdata, sizeof(int));
cudaMemcpyToSymbol(my_dev_data, &ddata, sizeof(int));
cudaCheckErrors("memcpy to symbol fail");}
for (int i = 0; i < num_dev; i++){
cudaSetDevice(i);
my_kernel<<<1,1>>>(i);
cudaDeviceSynchronize();}
cudaCheckErrors("kernel fail");
return 0;
}
$ nvcc -arch=sm_20 -o t223 t223.cu
$ ./t223
device 0 constant data is: 0
device 0 __device__ data is: 0
device 1 constant data is: 1
device 1 __device__ data is: 10
device 2 constant data is: 2
device 2 __device__ data is: 20
device 3 constant data is: 3
device 3 __device__ data is: 30
$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.