标签: cuda

4位整型数组的内存布局

int4和int2数组的内存布局是怎样的?认为,

int4 M[2];
M[0]=0xA;
M[1]=0x5;
Run Code Online (Sandbox Code Playgroud)

我应该在包含 M(0) 和 M(1) 的单个字节中看到什么?是0xA5还是0x5A?我知道 int4 不是 C/C++ 类型,但某些编译器必须处理它,因为 Nvidia 和 AMD GPU 支持它。

arrays integer cuda gpu

0
推荐指数
1
解决办法
443
查看次数

除了 CUDA 之外,C++ 中是否允许使用三重尖括号“<<<”和“>>>”?

nvcc 可以识别此语法,以在 CUDA 内核调用中分配线程和块的数量,但是在 CUDA 之外是否有任何上下文可以使其成为合法的 C++?(任何 C++ 版本,包括草稿?)

作为表达这个问题的另一种方式,源代码中引号之外的出现是否<<<可靠地表明它必须是 CUDA(或语法上不正确)?

(我知道>>>关闭三重嵌套模板参数时可能会发生这种情况,但左括号之间需要标识符。)

c++ syntax cuda

0
推荐指数
1
解决办法
99
查看次数

在 Cuda 内核的嵌套数组中混合使用静态和动态共享内存

我有时会在 CUDA 内核中看到以下共享内存声明,但我不确定它的含义:

extern __shared__ T shmem[][SZ]
Run Code Online (Sandbox Code Playgroud)

作为SZ编译时常量。内核启动如下:

kernel<<<grid, block, shared_memory_size>>>()
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 为什么动态和静态共享内存的混合会很有用(除了简化程序员的地址计算之外)?
  • 共享内存缓冲区 shmem 的总大小是多少?是吗shared_memory_size * SZ
  • 与问题2相关:假设我可以在编译时计算shared_memory_size,我将如何重写共享内存声明以使其成为静态?shared T shmem[SZ*shared_memory_size]

cuda gpu-shared-memory

0
推荐指数
1
解决办法
60
查看次数

为什么cudaFree不需要数据结构的地址?

我对工作方式有疑问cudaFree。在下面的代码中,为了在设备上分配数组,cudaMalloc需要数组的地址。这是通过使用&array_d.

int *array_d;
cudaMalloc((void**)&array_d, sizeof(int) * 100);
cudaFree(array_d);
Run Code Online (Sandbox Code Playgroud)

从逻辑上讲,当我们想要释放内存时,我们cudaFree还必须传递数组地址。否则,它如何知道哪部分内存必须被释放?

c memory-management cuda

0
推荐指数
1
解决办法
86
查看次数

Cuda中warp调度和warp上下文切换之间的关系

据我了解,就绪的warp是可以在warp调度中执行的warp。等待扭曲正在等待获取或计算源操作数,因此无法执行。Warp 调度程序选择一个准备好的 warp 来执行“warp 调度”。

另一方面,当一个 warp 出现管道停顿或全局内存延迟较长时,另一个 warp 将被执行以隐藏延迟。这就是cuda中“warp上下文切换”的基本思想。

我的问题是:Cuda中的warp调度和warp上下文切换之间有什么关系。为了详细说明我的问题,下面是一个例子。

例如,当warp A 停止时,warp A 是等待获取全局内存的warp,一旦获取元素,warp A 将被调度或切换到就绪warp 池中。基于此,warp上下文切换是warp调度的一部分。这是对的吗?

任何人都可以提供有关 Cuda 中的 warp 上下文切换和 warp 调度的任何参考吗?英伟达似乎没有公开这些文件。

预先感谢您的回复。

cuda gpu scheduling context-switch

-1
推荐指数
1
解决办法
1126
查看次数

cuda 中不再需要 extern "C" 了吗?

我从某人那里听说 nvcc 默认为 C++ 用于主机代码,因此不再需要 extern "C",除非主机代码的其余部分是 C,这是真的吗?

cuda

-1
推荐指数
1
解决办法
2969
查看次数

cudaStream 奇怪的表现

我尝试使用 cudaStream 开发 sobel 的示例。这是程序:

void SobelStream(void)
{

    cv::Mat imageGrayL2 = cv::imread("/home/xavier/Bureau/Image1.png",0);


    u_int8_t *u8_PtImageHost;
    u_int8_t *u8_PtImageDevice;

    u_int8_t *u8_ptDataOutHost;
    u_int8_t *u8_ptDataOutDevice;

    u_int8_t u8_Used[NB_STREAM];

    u8_ptDataOutHost = (u_int8_t *)malloc(WIDTH*HEIGHT*sizeof(u_int8_t));
    checkCudaErrors(cudaMalloc((void**)&u8_ptDataOutDevice,WIDTH*HEIGHT*sizeof(u_int8_t)));

    u8_PtImageHost = (u_int8_t *)malloc(WIDTH*HEIGHT*sizeof(u_int8_t));
    checkCudaErrors(cudaMalloc((void**)&u8_PtImageDevice,WIDTH*HEIGHT*sizeof(u_int8_t)));


    cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<unsigned char>();
    checkCudaErrors(cudaMallocArray(&Array_PatchsMaxDevice, &channelDesc,WIDTH,HEIGHT ));
    checkCudaErrors(cudaBindTextureToArray(Image,Array_PatchsMaxDevice));


    dim3 threads(BLOC_X,BLOC_Y);
    dim3 blocks(ceil((float)WIDTH/BLOC_X),ceil((float)HEIGHT/BLOC_Y));

    ClearKernel<<<blocks,threads>>>(u8_ptDataOutDevice,WIDTH,HEIGHT);


    int blockh = HEIGHT/NB_STREAM;


    Stream = (cudaStream_t *) malloc(NB_STREAM * sizeof(cudaStream_t));

    for (int i = 0; i < NB_STREAM; i++)
    {
        checkCudaErrors(cudaStreamCreate(&(Stream[i])));
    }

//    for(int i=0;i<NB_STREAM;i++)
//    {
//        cudaSetDevice(0);
//        cudaStreamCreate(&Stream[i]);
//    } …
Run Code Online (Sandbox Code Playgroud)

cuda

-1
推荐指数
1
解决办法
374
查看次数

同时在所有 GPU 核心上为每个 GPU 核心运行一个程序实例

我们有数百万个小文件要由某些程序处理。

精确的计划并不重要,变化与精确的任务。然而,这些是较小的 C++ 程序,我们有源代码,但它们本质上是不可并行的。

使用单个平均 CPU 内核(Intel i7 系列)时,处理一个小文件大约需要 15 秒。并且在程序运行时它需要大约 200 MB 的 RAM。

我们希望在 GPU 上并行化,并在每个 GPU 核心(例如 Cuda 核心)上运行一个程序实例。因此,如果 GPU 有 3000 个 CUDA 核心,那么我们希望并行运行 3000 个实例。如果可能,我们希望使用像 OpenCL 这样的通用框架(而不是 Cuda,但如果在这种情况下需要 Cuda,那将是可以接受的)。

现在我们正在尝试评估这是否可行(我们在 GPGPU 编程方面还没有太多经验)。我们想象的主要问题是记忆。如果我们并行运行 3000 个实例,每个实例需要 200 MB VRAM,那么我们需要 600 GB 内存。

我们主要考虑的显卡是高端 Geforce 卡,通常具有 8 GB 到 11 GB 的内存。我们有每个机箱/主板有 4 个卡的 GPU 工作站,我们一开始想用它(但后来也可能在其他 GPU 系统上,因此我们更喜欢像 OpenCL 这样的通用框架)。

有哪些方法可以解决这个问题?

parallel-processing cuda gpgpu opencl

-1
推荐指数
1
解决办法
358
查看次数

来自 CUDA 上共享内存中的非顺序访问的银行冲突

我正在编写一些 N 体模拟代码,在 CUDA 中针对 Volta 和图灵系列卡进行短程交互。我计划使用共享内存,但我不太清楚这样做时如何避免银行冲突。由于我的交互是本地的,我计划将我的粒子数据分类到本地组中,我可以将这些数据发送到每个 SM 的共享内存(还没有担心粒子的邻居正在从另一个 SM 工作。为了变得更好性能(避免库冲突),仅每个线程从/向共享内存的不同地址读取/写入就足够了,但每个线程可以无序访问该内存而不会受到惩罚?

我看到的所有信息似乎只提到内存被合并以从全局内存到共享内存的复制,但我没有看到任何关于扭曲(或整个 SM)中的线程是否关心共享内存中的合并。

cuda bank-conflict gpu-shared-memory

-1
推荐指数
1
解决办法
442
查看次数

我可以修复我的 GPU 时钟频率以确保一致的分析结果吗?

我想对几个 CUDA 内核进行一些比较分析。但是,其中一个在一个程序中运行,该程序为 GPU 加载更多工作,而另一个仅在测试工具中运行。

对于某些 GPU,这些情况意味着时钟频率会发生变化(可能不止一种时钟频率,因为有多种)。这种影响在像 Tesla T4 这样的设备(没有主动冷却)中尤为严重。

是否可以防止时钟速率因负载(或热条件)而改变?

我已经研究过这个nvidia-smi实用程序,它有一个名为clocks-的子命令,但它所做的只是以下内容:

clocks -- Control and query clock information.

Usage: nvidia-smi clocks [options]
options include:
   [-i | --id]: Enumeration index, PCI bus ID or UUID. Provide comma
                 separated values for more than one device
   [ | --sync-boost-list]: List all synchronous boost groups
   [ | --sync-boost-add]: Add a synchronous boost group

   [ | --sync-boost-remove]: Remove a synchronous boost group. Provide the group id
                 returned from --sync-boost-list

Run Code Online (Sandbox Code Playgroud)

......看起来这不是我需要的。当然,非 …

benchmarking profiling cuda clock

-1
推荐指数
1
解决办法
3299
查看次数