我有一个CUDA(v5.5)应用程序需要使用全局内存。理想情况下,我希望使用常量内存,但我已经用尽了常量内存,溢出的部分必须放在全局内存中。我还有一些变量需要偶尔写入(在GPU上进行一些约简操作之后),并将其放置在全局内存中。
对于读取,我将以简单的方式访问全局内存。我的内核在for循环内调用,在每次内核调用时,每个线程将以没有偏移量的方式访问完全相同的全局内存地址。对于写入,在每次内核调用之后,在GPU上进行约简操作,必须在循环的下一次迭代之前将结果写入全局内存。但是,在我的应用程序中,从全局内存中读取的次数要比写入的次数多得多。
我的问题是,使用全局(变量)作用域中声明的全局内存是否比使用动态分配的全局内存具有优势?我需要的全局内存量将根据应用程序而变化,因此出于这个原因,动态分配更可取。但是,我知道我全局内存使用的上限,并且更关心性能,因此也可以使用静态声明内存,使用一个足够大的固定分配,确保不会溢出。从性能的角度考虑,是否有理由更喜欢一种形式的全局内存分配而不是另一种?它们是否存在于GPU上的同一个物理位置,并且它们被缓存的方式相同,或者两种形式的读取成本不同?
对于读取,我将以简单的方式访问全局内存。我的内核在for循环内调用,在每次内核调用时,每个线程将以没有偏移量的方式访问完全相同的全局内存地址。对于写入,在每次内核调用之后,在GPU上进行约简操作,必须在循环的下一次迭代之前将结果写入全局内存。但是,在我的应用程序中,从全局内存中读取的次数要比写入的次数多得多。
我的问题是,使用全局(变量)作用域中声明的全局内存是否比使用动态分配的全局内存具有优势?我需要的全局内存量将根据应用程序而变化,因此出于这个原因,动态分配更可取。但是,我知道我全局内存使用的上限,并且更关心性能,因此也可以使用静态声明内存,使用一个足够大的固定分配,确保不会溢出。从性能的角度考虑,是否有理由更喜欢一种形式的全局内存分配而不是另一种?它们是否存在于GPU上的同一个物理位置,并且它们被缓存的方式相同,或者两种形式的读取成本不同?