0

ArrayFireを使用して、9000x9000ピクセルの3チャンネル画像(約75MB)で畳み込みを実行しようとしています。私のGPUは、1536MBのRAMを搭載したNVIDIAGTX480です。ArrayFireは入力画像に75MB、出力画像に約75MBを使用すると思います。ただし、ArrayFireはしばらくの間実行され、最終的にはメモリが不足していると表示されます。

Memory Usage: 1325 MB free (1536 MB total) //printed before calling convolutionTest()
warning: device memory is low //printed in convolutionTest()
src/gena/gi_mem.cpp:349: error: tried to allocate 309mb (45mb free / 1536mb total) //exception

1536MBのメモリを搭載したGPUで75MBの画像に対して畳み込みを実行すると、ArrayFireのメモリが不足します。なぜこれが起こるのですか、そして私はそれについて何ができますか?


コード:

#include <stdio.h>
#include <arrayfire.h>
using namespace af;

static const float h_sobel[] = {-2.0, -1.0,  0.0,
                                -1.0,  0.0,  1.0,
                                0.0,  1.0,  2.0}; // 3x3 sobel weights

static void convolutionTest() {
    array sobel_k = array(3, 3, h_sobel);
    array img_gray = loadimage("9k_x_9k.png", false); // 'false' makes it a 1 channel grayscale [0-255]
    array img_convolved = convolve(img_gray, sobel_k); // should I preallocate the output space?
}

int main(int argc, char** argv) {
    try {
        info();
        convolutionTest();
    } catch (af::exception& e) {
        fprintf(stderr, "%s\n", e.what()); //prints src/gena/gi_mem.cpp:349: error: tried to allocate 309mb (45mb free / 1536mb total)
    }
    return 0;
}

システム構成と注意事項:

  • ArrayFire 1.9
  • Ubuntu 10.04
  • CUDA 5.0
  • 1536MBのRAMを搭載したNVIDIAGTX480(Fermi)GPU
  • helloworldおよびその他のArrayFireの例は正しく機能します
  • ArrayFireの畳み込みは、小さい画像(512x512ピクセルなど)でも問題ありません。
4

1 に答える 1

2

これはloadImage関数のバグです。3つのチャネルすべてにロードされているため、必要以上のメモリを消費しています。AccelerEyesは次の夜までにそれを修正し、すぐに報告します。

于 2013-01-09T00:08:49.397 に答える