<legend id='hzdQ0'><style id='hzdQ0'><dir id='hzdQ0'><q id='hzdQ0'></q></dir></style></legend>

    1. <tfoot id='hzdQ0'></tfoot>

    2. <small id='hzdQ0'></small><noframes id='hzdQ0'>

        • <bdo id='hzdQ0'></bdo><ul id='hzdQ0'></ul>
        <i id='hzdQ0'><tr id='hzdQ0'><dt id='hzdQ0'><q id='hzdQ0'><span id='hzdQ0'><b id='hzdQ0'><form id='hzdQ0'><ins id='hzdQ0'></ins><ul id='hzdQ0'></ul><sub id='hzdQ0'></sub></form><legend id='hzdQ0'></legend><bdo id='hzdQ0'><pre id='hzdQ0'><center id='hzdQ0'></center></pre></bdo></b><th id='hzdQ0'></th></span></q></dt></tr></i><div id='hzdQ0'><tfoot id='hzdQ0'></tfoot><dl id='hzdQ0'><fieldset id='hzdQ0'></fieldset></dl></div>

      1. Pycuda块和格网,用于处理大数据

        时间:2024-08-11

        1. <legend id='m3hdS'><style id='m3hdS'><dir id='m3hdS'><q id='m3hdS'></q></dir></style></legend>
          <i id='m3hdS'><tr id='m3hdS'><dt id='m3hdS'><q id='m3hdS'><span id='m3hdS'><b id='m3hdS'><form id='m3hdS'><ins id='m3hdS'></ins><ul id='m3hdS'></ul><sub id='m3hdS'></sub></form><legend id='m3hdS'></legend><bdo id='m3hdS'><pre id='m3hdS'><center id='m3hdS'></center></pre></bdo></b><th id='m3hdS'></th></span></q></dt></tr></i><div id='m3hdS'><tfoot id='m3hdS'></tfoot><dl id='m3hdS'><fieldset id='m3hdS'></fieldset></dl></div>
          <tfoot id='m3hdS'></tfoot>
            <bdo id='m3hdS'></bdo><ul id='m3hdS'></ul>
              <tbody id='m3hdS'></tbody>

            1. <small id='m3hdS'></small><noframes id='m3hdS'>

                  本文介绍了Pycuda块和格网,用于处理大数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我需要帮助才能知道我的块和网格的大小。 我正在构建一个python应用程序来执行基于Scipy的公制计算:欧几里德距离、曼哈顿、皮尔逊、余弦、加入其他。

                  项目为PycudaDistances。

                  它似乎可以很好地处理小数组。当我执行更详尽的测试时,不幸的是它不起作用。我下载了电影镜头集(http://www.grouplens.org/node/73)。

                  使用Movielens100k,我声明了一个形状为(943,1682)的数组。也就是说,用户对943部和1682部电影进行了评价。电影不是由分类器用户我将值配置为0。

                  使用更大的数组算法不再起作用。我面临以下错误:

                  pycuda._driver.LogicError:cuFuncSetBlockShape失败:无效值。

                  研究此错误时,我找到了一个解释,告诉支持512个线程的Andrew加入并处理较大的块时,必须使用块和网格。

                  我希望得到帮助,使欧几里德距离数组算法能够从小数组工作到巨型数组。

                  def euclidean_distances(X, Y=None, inverse=True):
                      X, Y = check_pairwise_arrays(X,Y)
                      rows = X.shape[0]
                      cols = Y.shape[0]
                      solution = numpy.zeros((rows, cols))
                      solution = solution.astype(numpy.float32)
                  
                      kernel_code_template = """
                      #include <math.h>
                      
                      __global__ void euclidean(float *x, float *y, float *solution) {
                  
                          int idx = threadIdx.x + blockDim.x * blockIdx.x;
                          int idy = threadIdx.y + blockDim.y * blockIdx.y;
                          
                          float result = 0.0;
                          
                          for(int iter = 0; iter < %(NDIM)s; iter++) {
                              
                              float x_e = x[%(NDIM)s * idy + iter];
                              float y_e = y[%(NDIM)s * idx + iter];
                              result += pow((x_e - y_e), 2);
                          }
                          int pos = idx + %(NCOLS)s * idy;
                          solution[pos] = sqrt(result);
                      }
                      """
                      kernel_code = kernel_code_template % {
                          'NCOLS': cols,
                          'NDIM': X.shape[1]
                      }
                  
                      mod = SourceModule(kernel_code)
                  
                      func = mod.get_function("euclidean")
                      func(drv.In(X), drv.In(Y), drv.Out(solution), block=(cols, rows, 1))
                  
                      return numpy.divide(1.0, (1.0 + solution)) if inverse else solution
                  

                  有关详细信息,请参阅:https://github.com/vinigracindo/pycudaDistances/blob/master/distances.py

                  推荐答案

                  要调整内核执行参数的大小,您需要执行两项操作(按此顺序):

                  1.确定挡路大小

                  您的挡路大小主要取决于硬件限制和性能。我推荐阅读this answer以获取更多详细信息,但非常简短的总结是,您的图形处理器对每个挡路可以运行的线程总数有限制,并且它有有限的寄存器堆、共享和本地内存大小。您选择的挡路维度必须在这些限制之内,否则内核将无法运行。挡路的大小也会影响内核的性能,你会发现挡路的大小可以提供最佳的性能。挡路大小应始终是翘曲大小的整数倍,在迄今发布的所有CUDA兼容硬件上,后者为32。

                  2.确定网格大小

                  对于您所显示的内核类型,您需要的块数与输入数据量和每个挡路的维度直接相关。

                  例如,如果您的输入数组大小为943x1682,而您的挡路大小为16x16,那么您将需要一个59x106网格,这将在内核启动时产生944x1696个线程。在这种情况下,输入数据大小不是挡路大小的整数倍,您需要修改内核以确保它不会读取越界。一种方法可能类似于:

                  __global__ void euclidean(float *x, float *y, float *solution) {
                      int idx = threadIdx.x + blockDim.x * blockIdx.x;
                      int idy = threadIdx.y + blockDim.y * blockIdx.y;
                  
                       if ( ( idx < %(NCOLS)s ) && ( idy < %(NDIM)s ) ) {
                  
                          .....
                       }
                  }
                  

                  启动内核的python代码可能类似于:

                  bdim = (16, 16, 1)
                  dx, mx = divmod(cols, bdim[0])
                  dy, my = divmod(rows, bdim[1])
                  
                  gdim = ( (dx + (mx>0)) * bdim[0], (dy + (my>0)) * bdim[1]) )
                  func(drv.In(X), drv.In(Y), drv.Out(solution), block=bdim, grid=gdim)
                  

                  This question and answer还可能有助于了解此过程的工作原理。

                  请注意,上述所有代码都是在浏览器中编写的,从未经过测试。使用它的风险自负。

                  还请注意,它基于对您的代码的非常简短的阅读,可能不正确,因为您在问题中没有真正描述任何有关如何调用代码的内容。

                  这篇关于Pycuda块和格网,用于处理大数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:FastAPI UploadFile慢速 下一篇:如何打印生成器表达式?

                  相关文章

                  <small id='je5H3'></small><noframes id='je5H3'>

                    <tfoot id='je5H3'></tfoot>
                      <bdo id='je5H3'></bdo><ul id='je5H3'></ul>

                    1. <i id='je5H3'><tr id='je5H3'><dt id='je5H3'><q id='je5H3'><span id='je5H3'><b id='je5H3'><form id='je5H3'><ins id='je5H3'></ins><ul id='je5H3'></ul><sub id='je5H3'></sub></form><legend id='je5H3'></legend><bdo id='je5H3'><pre id='je5H3'><center id='je5H3'></center></pre></bdo></b><th id='je5H3'></th></span></q></dt></tr></i><div id='je5H3'><tfoot id='je5H3'></tfoot><dl id='je5H3'><fieldset id='je5H3'></fieldset></dl></div>
                      <legend id='je5H3'><style id='je5H3'><dir id='je5H3'><q id='je5H3'></q></dir></style></legend>