我不明白以下几行到底发生了什么:
unsigned char *membershipChanged = (unsigned char *)sharedMemory;
Run Code Online (Sandbox Code Playgroud)
float *clusters = (float *)(sharedMemory + blockDim.x);
Run Code Online (Sandbox Code Playgroud)
我假设 in #1sharedMemory有效地重命名为membershipChanged,但为什么要将 the 添加blockDim到sharedMemory指针中。这个地址指向哪里?
sharedMemory创建于 extern __shared__ char sharedMemory[];
我在CUDA kmeans 实现中找到的代码。
void find_nearest_cluster(int numCoords,
int numObjs,
int numClusters,
float *objects, // [numCoords][numObjs]
float *deviceClusters, // [numCoords][numClusters]
int *membership, // [numObjs]
int *intermediates)
{
extern __shared__ char sharedMemory[];
// The type chosen for membershipChanged must be large enough to support
// reductions! There are …Run Code Online (Sandbox Code Playgroud) 我正在尝试用CUDA 2.0(NVIDIA 590)处理一系列大型结构.我想为它使用共享内存.我已经尝试了CUDA占用计算器,尝试为每个线程分配最大共享内存,以便每个线程可以处理整个数组元素.但是,我在100%多处理器加载的计算器中可以看到的最大值(每块的共享内存)/(每块的线程数)是32字节,这对于单个元素(在数量级上)是不够的.32个字节是(每个块的共享内存)/(每个块的线程数)的最大可能值吗?是否可以说哪个alter4native更可取 - 在全局内存中分配数组的一部分还是只使用欠载的多处理器?或者它只能通过实验来决定?我能看到的另一个替代方案是在几个过程中处理数组,但它看起来像是最后的手段.这是我第一次尝试与CUDA非常复杂的东西,所以我可能会错过其他一些选择......
您能否解释一下在 CUDA 编程中使用“16 KB 共享内存 + 48K L1 缓存”或“48 KB 共享内存 + 16 KB L1 缓存”之间的区别?在时间执行中我应该期待什么?我什么时候可以减少 GPU 运行时间?
我试图利用这个内核函数中的共享内存,但性能没有我预期的那么好。这个函数在我的应用程序中被调用很多次(大约1000次或更多),所以我想利用共享内存来避免内存延迟。但显然有些问题,因为我使用共享内存,我的应用程序变得非常慢。
这是内核:
__global__ void AndBitwiseOperation(int* _memory_device, int b1_size, int* b1_memory, int* b2_memory){
int j = 0;
// index GPU - Transaction-wise
unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;
unsigned int tid = threadIdx.x;
// shared variable
extern __shared__ int shared_memory_data[];
extern __shared__ int shared_b1_data[];
extern __shared__ int shared_b2_data[];
// copy from global memory into shared memory and sync threads
shared_b1_data[tid] = b1_memory[tid];
shared_b2_data[tid] = b2_memory[tid];
__syncthreads();
// AND each int bitwise
for(j = 0; j < b1_size; j++) …Run Code Online (Sandbox Code Playgroud) 正如我所看到的,在Google 和许多网站上, nVidia Quadro KXXXXM - 移动 GPU (MXM)都有“共享内存:否” 。
但如果我想为这些卡编写 CUDA C/C++,我可以在代码中使用共享内存吗?如果我可以,那么如果我这样做会发生什么 - 它会使用全局 GPU-RAM 吗?
如果我每个 SM 有 48kB 共享内存,并且我编写了一个分配 32kB 共享内存的内核,这意味着一个 SM 上只能同时运行 1 个块?
clang 编译器包含 CUDA 头文件 host_defines.h,其中__shared__定义为__attribute__((shared))。当使用 clang 将 CUDA 源文件编译为内部表示 (IR) 时,这些文件__shared__将转换为addrspace(3). 这些地址空间可以在 clang 文件llvm/tools/clang/lib/Basic/Targets.cpp行号 1601 中作为数组观察
static const unsigned NVPTXAddrSpaceMap[] = {
1, // opencl_global
3, // opencl_local
4, // opencl_constant
// FIXME: generic has to be added to the target
0, // opencl_generic
1, // cuda_device
4, // cuda_constant
3, // cuda_shared
};
Run Code Online (Sandbox Code Playgroud)
所以具体的问题是在转换的哪个阶段,被__attribute__((shared))转换为addrspace(3)。查看 clang 的解析和词法分析部分并没有给出任何暗示。有人可以帮忙吗?
我刚刚开始学习 CUDA,出于比较目的,我在将一些代码转换为使用共享内存和将另一代码转换为使用常量内存时遇到问题。
__global__ void CUDA(int *device_array_Image1, int *device_array_Image2,int *device_array_Image3, int *device_array_kernel, int *device_array_Result1,int *device_array_Result2,int *device_array_Result3){
int i = blockIdx.x;
int j = threadIdx.x;
int ArraySum1 = 0 ; // set sum = 0 initially
int ArraySum2 = 0 ;
int ArraySum3 = 0 ;
for (int N = -1 ; N <= 1 ; N++)
{
for (int M = -1 ; M <= 1 ; M++)
{
ArraySum1 = ArraySum1 + (device_array_Image1[(i + N) * Image_Size + (j + …Run Code Online (Sandbox Code Playgroud) 我正在运行 1024 个矩阵的适应度函数,每个矩阵都有自己的块并且大小相同。每个块都有n*n线程(矩阵的维度)并且需要具有n*n共享内存,以便我可以轻松进行求和缩减。然而,n所有矩阵的维数在运行前都是可变的(即可以手动更改,但始终是 2 的幂,因此求和很简单)。这里的问题是共享内存必须使用常量分配,但我还需要将值从主机传递到内核。我在哪里声明维度,n以便它对 CPU 可见(用于传递给内核)并可用于声明共享内存的大小(在内核内)?
我的代码结构如下:
从main.cu我调用内核:
const int num_states = 1024
const int dimension = 4
fitness <<< num_states, dimension * dimension >>> (device_array_of_states, dimension, num_states, device_fitness_return);
Run Code Online (Sandbox Code Playgroud)
然后kernel.cu我有:
__global__ void fitness(
int *numbers,
int dimension,
int num_states,
int *fitness_return) {
__shared__ int fitness[16]; <<-- needs to be dimension * dimension
//code
}
Run Code Online (Sandbox Code Playgroud)
numbers是表示 1024 个矩阵的数组,dimension是行和列长度,num_states是 1024,fitness_return是长度为 1024 的数组,用于保存每个矩阵的适应度值。在内核中,共享内存是用 …
我有一个长度为128的向量;所有元素在整个计算过程中都是恒定的。
我喜欢在 CUDA 内核中使用这个常量向量。我正在考虑将该向量存储在共享内存中,并在内核中使用它。我想知道该怎么做?几行代码就很好了。
或者这是最好的方法吗?多谢。
我们可以通过全局内存传递头顶:
__global__ void fun(float* a, float* coeff)
{
size_t
i = blockIdx.x * blockDim.x + threadIdx.x;
if (i >= 128)
return;
a[i] *= coeff[i];
}
Run Code Online (Sandbox Code Playgroud)
但这可能不是最好的方法。我想象类似的事情
__shared__ float coeff[128];
Run Code Online (Sandbox Code Playgroud)
但是如何将 CPU 值复制到该共享内存呢?我应该将此共享内存传递给我的内核吗?