Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CUDA如何获得网格、块、螺纹尺寸和视差非方矩阵计算_C++_Visual Studio 2008_Gpu_Cuda - Fatal编程技术网

C++ CUDA如何获得网格、块、螺纹尺寸和视差非方矩阵计算

C++ CUDA如何获得网格、块、螺纹尺寸和视差非方矩阵计算,c++,visual-studio-2008,gpu,cuda,C++,Visual Studio 2008,Gpu,Cuda,我是CUDA的新手,需要帮助了解一些事情。我需要帮助并行这两个for循环。特别是如何设置dimBlock和dimGrid以加快运行速度。我知道这看起来像sdk中的vector add示例,但该示例仅适用于方形矩阵,当我尝试修改128 x 1024矩阵的代码时,它无法正常工作 __global__ void mAdd(float* A, float* B, float* C) { for(int i = 0; i < 128; i++) { for(int j

我是CUDA的新手,需要帮助了解一些事情。我需要帮助并行这两个for循环。特别是如何设置dimBlock和dimGrid以加快运行速度。我知道这看起来像sdk中的vector add示例,但该示例仅适用于方形矩阵,当我尝试修改128 x 1024矩阵的代码时,它无法正常工作

__global__ void mAdd(float* A, float* B, float* C)
{
    for(int i = 0; i < 128; i++)
    {
        for(int j = 0; j < 1024; j++)
        {
            C[i * 1024 + j] = A[i * 1024 + j] + B[i * 1024 + j];
        }
    }
}
\uuuuu全局\uuuuu无效mAdd(浮点*A、浮点*B、浮点*C)
{
对于(int i=0;i<128;i++)
{
对于(int j=0;j<1024;j++)
{
C[i*1024+j]=A[i*1024+j]+B[i*1024+j];
}
}
}

这段代码是更大循环的一部分,也是代码中最简单的部分,所以我决定尝试并行化thia,同时学习CUDA。我已经阅读了指南,但仍然不理解如何获得适当数量的网格/块/线程并有效地使用它们。

正如您所写的,该内核是完全串行的。为执行它而启动的每个线程都将执行相同的工作

CUDA(以及OpenCL和其他类似的“单程序、多数据”类型编程模型)背后的主要思想是,您需要执行一个“数据并行”操作——因此必须多次执行相同的、基本独立的操作——并编写一个执行该操作的内核。然后启动大量(半)自治线程,在输入数据集中执行该操作

在阵列添加示例中,数据并行操作是

C[k] = A[k] + B[k];
对于0和128*1024之间的所有k。每个加法操作都是完全独立的,没有订购要求,因此可以由不同的线程执行。要在CUDA中表达这一点,可以这样编写内核:

__global__ void mAdd(float* A, float* B, float* C, int n)
{
    int k = threadIdx.x + blockIdx.x * blockDim.x;

    if (k < n)
        C[k] = A[k] + B[k];
}
const int n = 128 * 1024;
int blocksize = 512; // value usually chosen by tuning and hardware constraints
int nblocks = n / blocksize; // value determine by block size and total work

madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);
\uuuuu全局\uuuuu无效mAdd(浮点*A、浮点*B、浮点*C、整数n)
{
int k=threadIdx.x+blockIdx.x*blockDim.x;
if(k
[免责声明:在浏览器中编写的代码,未经测试,使用风险自负]

在这里,串行代码的内部和外部循环被每个操作一个CUDA线程替换,并且我在代码中添加了一个限制检查,以便在启动的线程多于所需操作的情况下,不会发生缓冲区溢出。如果内核按如下方式启动:

__global__ void mAdd(float* A, float* B, float* C, int n)
{
    int k = threadIdx.x + blockIdx.x * blockDim.x;

    if (k < n)
        C[k] = A[k] + B[k];
}
const int n = 128 * 1024;
int blocksize = 512; // value usually chosen by tuning and hardware constraints
int nblocks = n / blocksize; // value determine by block size and total work

madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);
const int n=128*1024;
int blocksize=512;//值通常由调整和硬件约束选择
int nblocks=n/块大小;//值由块大小和总工时确定
maddmAdd(A,B,C,n);
然后将256个块(每个块包含512个线程)启动到GPU硬件上,以并行执行阵列添加操作。请注意,如果输入数据大小不能表示为块大小的整数倍,则需要向上舍入块的数量以覆盖整个输入数据集


以上所有内容都是对CUDA范例的一个非常简单的概述,用于一个非常简单的操作,但也许它为您提供了足够的洞察力,让您可以继续自己的工作。CUDA现在已经相当成熟了,网络上有很多好的、免费的教育材料,你可能可以用它们来进一步阐明我在这个答案中提到的编程模型的许多方面

在这里,它只是
C[i]=A[i]+B[i]
(主题外)您当前将i作为两个循环的索引(您忘记了j)。谢谢talonmies。这确实帮助我理解了块和网格的大小。我所做的所有阅读突然变得有意义了。intk=threadIdx.x+gridDim.x*blockDim.x;这肯定是错误的吗?示例中的gridDim.x*blockDim.x始终为256*512。应该是int k=threadIdx.x+blockIdx.x*blockDim.x;我试图编辑它,但被拒绝。警告浏览者:nblocks=ceil(n/nthreads);//如果您的数据不能完美分割。@ofer.sheffer:我确实写过“注意,如果输入数据大小不能表示为块大小的整数倍,则块的数量需要向上舍入以覆盖整个输入数据集。”。这还不够清楚吗?@Talonmes,你的答案很好,我投了更高的票。另一方面,当我读到它的时候,我在想“他错过了+1”,以防数据不平均分配。。。然后我继续读了一些其他的东西,然后回到这里来完成阅读,我注意到你写了它。作为一个略读者,我通常只是先看代码,然后再考虑阅读每一个单词——我想我的警告会对我未来的自我有所帮助。