OpenCLのサンプルプログラムがうまくいきません。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kuro
記事: 47
登録日時: 14年前

OpenCLのサンプルプログラムがうまくいきません。

#1

投稿記事 by kuro » 14年前

まず、使用したPCは、
MouseComputer社製 LuvBook Tシリーズ
OS Windous7 Home Plemium 64bit 正規版
プロセッサー インテル® Core™ i7-2670QM プロセッサー(2.20GHz / 4コア)
グラフィックス NVIDIA® GeForce® GT540M / インテル® HD グラフィックス 3000(NVIDIA® Optimus™テクノロジ対応)
です。

インストールしたものは、
NVIDIA グラフィックス ドライバー 285.62
CUDA Toolkit 4.1
GPU Computing SDK 4.1
Visual Studio 2008 c++ Express Edition
winsdk_web.exe setup_x64.bat (この2つは、64bitプラットフォームを作成するためにインストール、実行しました。詳しくは、http://absolutearea.blogspot.com/2010/0 ... m-sdk.html)

設定したパスは、
追加のインクルードディレクトリ "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.1\include"
追加のライブラリディレクトリ   "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.1\lib\x64"
追加の依存ファイル        OpenCL.lib

です。

http://www.shuwasystem.co.jp/support/7980html/2608.html
このサイトから、サンプルファイルをダウンロードしたのですが、Bitmapクラスを作成する、というプログラムの実行結果を得ることが出来ません。

手順としては、
新しいソリューションを作成。
ソースファイルを右クリックして、ダウンロードしたファイルから、Bitmap.cppを追加。
ヘッダファイルを右クリックして、ダウンロードしたファイルから、Bitmap.h と Bitmapspec.h と MyError.h を追加。
上記のパスを通す。
ビルド。

を行ったところ、

1>------ ビルド開始: プロジェクト: Bitmap, 構成: Debug Win32 ------
1>コンパイルしています...
1>Bitmap.cpp
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(12) : fatal error C1083: include ファイルを開けません。'MyError.h': No such file or directory
1>ビルドログは "file://c:\Users\kuro\Documents\Visual Studio 2008\Projects\Bitmap\Bitmap\Debug\BuildLog.htm" に保存されました。
1>Bitmap - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

というエラーが出ました。

MyError.h というヘッダファイルは確かに存在しているのですが、一体どういうことなのでしょうか?
このエラーを見る限り、MyError.h だけということはなく、Bitmap.h と Bitmapspec.h も同様のエラーが出ているものと思います。

どなたか解決法、またはこうしたらよいのでは? という方がいらっしゃいましたらよろしくお願いします。

プログラムは、

[Bitmap.cpp]

コード:

// List5.3

/*
 *  Bitmap.cpp (rev1.1, 28.Nov.2010)
 *  Copyright 2010 Takashi Okuzono. All rights reserved.
 */

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "MyError.h"
#include "Bitmap.h"

/*-------------------------------------------------------------------------
 * コンストラクタ
 */
Bitmap::Bitmap()
: mWidth(0), mHeight(0), mData(0), mDataSize(0), mTotalPixels(0)
{
    assert(sizeof(MyBYTE)  == 1);
    assert(sizeof(MyWORD)  == 2);
    assert(sizeof(MyDWORD) == 4);
    assert(sizeof(MyLONG)  == 4);
}

/*-------------------------------------------------------------------------
 * デストラクタ
 */
Bitmap::~Bitmap()
{
    if (mData != 0) {
        delete [] mData;
        mData = 0;
    }
    mDataSize = 0;
}

/*-------------------------------------------------------------------------
 * ビットマップデータを作成する
 * 
 * width, height: ビットマップの幅, 高さ
 * dataR, dataG, dataB: 0から1.0fで表現した色値
 */
void
Bitmap::create(const int width, const int height,
               const float* dataR, const float* dataG, const float* dataB)
{
    initialize(width, height);
    fillData(dataR, dataG, dataB);
}

/*-------------------------------------------------------------------------
 * ビットマップデータを作成する
 *
 * width, height: ビットマップの幅、高さ
 * dataR, dataG, dataB: 0から255で表現した色値
 */
void
Bitmap::create(const int width, const int height,
               const unsigned char* dataR,
               const unsigned char* dataG,
               const unsigned char* dataB)
{
    initialize(width, height);
    fillData(dataR, dataG, dataB);
}

/*-------------------------------------------------------------------------
 * ビットマップデータを作成する
 *
 * width, height: ビットマップの幅、高さ。
 * dataBgra: 1つのピクセル値を、BGRA 4バイトで表したイメージデータ。
 *           BGRAそれぞれの値は、0から255までの値を取る。
 */
void
Bitmap::createFromBgra(const int width, const int height,
                       const unsigned char* dataBgra)
{
    initialize(width, height);
    fillBgraData(dataBgra);
}

/*-------------------------------------------------------------------------
 * ビットマップファイルを読み込む
 *
 * path: 読み込むビットマップファイル
 */
void
Bitmap::readFile(const char *path)
{
    FILE *ifp;
    
	fopen_s(&ifp, path, "rb");
    
	if (ifp == 0) {
        perror("fopen");
        fprintf(stderr, "file: %s\n", path);
        throw MyError("bitmap file open failed", __FUNCTION__);
    }

    int error;
    error = readFileHeader(ifp);
    if (error > 0) {
        throw MyError("failed to read bitmap file header", __FUNCTION__);
    }

    error = readInfoHeader(ifp);
    if (error > 0) {
        throw MyError("failed to read bitmap info header", __FUNCTION__);
    }

    mDataSize = mFileHeader.bfSize - mInfoHeader.biSize - sizeof(mFileHeader);
    if (mData != 0) {
        delete [] mData;
    }
    mData = new unsigned char[mDataSize];

    error = readBitmapData(ifp);
    if (error > 0) {
        throw MyError("failed to read bitmap data", __FUNCTION__);
    }

    mWidth  = mInfoHeader.biWidth;
    mHeight = mInfoHeader.biHeight;

    fclose(ifp);
}

/*-------------------------------------------------------------------------
 * ビットマップファイルを書き出す
 *
 * path: 書き出すビットマップファイル
 */
void
Bitmap::writeFile(const char *path) const
{
    FILE *ofp;

	fopen_s(&ofp, path, "wb");

    if (ofp == 0) {
        perror("fopen");
        fprintf(stderr, "file: %s\n", path);
        throw MyError("bitmap file open failed", __FUNCTION__);
    }

    writeFileHeader(ofp);
    writeInfoHeader(ofp);
    writeBitmapData(ofp);
    
    fclose(ofp);
}

/*-------------------------------------------------------------------------
 * 画像データをR, G, Bチャンネル (dataR, dataG, dataB) に分割して返す。
 */
void
Bitmap::getRgbData(unsigned char* dataR,
                   unsigned char* dataG,
                   unsigned char* dataB) const
{
    int index = 0;


    if (mInfoHeader.biBitCount == 32) {
        // 32-bitビットマップ (BGRA)
        for (int i = 0; i < mDataSize; i += 4) {
            dataB[index] = mData[i + 0];
            dataG[index] = mData[i + 1];
            dataR[index] = mData[i + 2];
            index++;
        }
    } else if (mInfoHeader.biBitCount == 24) {
        // 24-bitビットマップ (BGR)
        for (int i = 0; i < mDataSize; i += 3) {
            dataB[index] = mData[i + 0];
            dataG[index] = mData[i + 1];
            dataR[index] = mData[i + 2];
            index++;
        }
    } else {
        throw MyError("Unsupported bitmap format", __FUNCTION__);
    }
}

/*-------------------------------------------------------------------------
 * 画像データをBGRAとして返す。
 */
void
Bitmap::getBgraData(unsigned char* dataBgra) const
{
    if (mInfoHeader.biBitCount == 32) {
        // 32bitビットマップはBGRAの順に並んでいるので、そのままコピーする。
        memcpy(dataBgra, mData, mDataSize);
    } else if (mInfoHeader.biBitCount == 24) {
        // 24bitビットマップはAチャンネルにダミーのデータをセットする。
        int index = 0;
        for (int i = 0; i < mDataSize; i += 3) {
            dataBgra[index++] = mData[i + 0];  // B
            dataBgra[index++] = mData[i + 1];  // G
            dataBgra[index++] = mData[i + 2];  // R
            dataBgra[index++] = 255;           // A
        }
    } else {
        throw MyError("Unsupported bitmap format", __FUNCTION__);        
    }
}

/*-------------------------------------------------------------------------
 *
 */
void
Bitmap::initialize(const int width, const int height)
{
    if (width <= 0) {
        throw MyError("width must be > 0\n", __FUNCTION__);
    }
    if (width % 4 != 0) {
        throw MyError("width must be a multiply of 4.", __FUNCTION__);
    }

    initFileHeader();
    initInfoHeader();

    mWidth  = width;
    mHeight = height;

    const int absHeight = height > 0 ? height : height * -1;
    mTotalPixels = width * absHeight;
    mDataSize = mTotalPixels * 3;

    if (mData != 0) {
        delete [] mData;
        mData = 0;
    }
    mData = new unsigned char[mDataSize];

    mInfoHeader.biWidth = width;
    mInfoHeader.biHeight = height;
    mFileHeader.bfSize = (MyDWORD)(mDataSize
                                   + sizeof(mFileHeader)
                                   + sizeof(mInfoHeader));
}

/*-------------------------------------------------------------------------
 *
 */
void
Bitmap::fillData(const float* dataR, const float* dataG, const float* dataB)
{
    int index = 0;

    for (int i = 0; i < mDataSize; i += 3) {
        mData[i + 0] = getPixelValue(dataB[index]);
        mData[i + 1] = getPixelValue(dataG[index]);
        mData[i + 2] = getPixelValue(dataR[index]);
        index++;
    }
}

/*-------------------------------------------------------------------------
 *
 */
void
Bitmap::fillData(const unsigned char* dataR,
                 const unsigned char* dataG,
                 const unsigned char* dataB)
{
    int index = 0;
    
    for (int i = 0; i < mDataSize; i += 3) {
        mData[i + 0] = dataB[index];
        mData[i + 1] = dataG[index];
        mData[i + 2] = dataR[index];
        index++;
    }
}

/*-------------------------------------------------------------------------
 * 受け取ったBGRAデータを、内部のデータとしてセットする。
 * BGRのみ取得し、Aチャンネルは捨てる。
 */
void
Bitmap::fillBgraData(const unsigned char* dataBgra)
{
    int index = 0;
    int bgraSize = (mDataSize * 4) / 3;
    
    for (int i = 0; i < bgraSize; i += 4) {
        mData[index++] = dataBgra[i + 0];    // B
        mData[index++] = dataBgra[i + 1];    // G
        mData[index++] = dataBgra[i + 2];    // R
        // mData[index++] = dataBgra[i + 3]; // A
    }
}

/*-------------------------------------------------------------------------
 *
 */
int
Bitmap::readFileHeader(FILE *fp)
{
    int error = 0;
    const size_t numobject = 1;
    
    size_t result = fread(&mFileHeader, sizeof(mFileHeader), numobject, fp);
    if (numobject != result) {
        error++;
    }
    
    return error;
}

/*-------------------------------------------------------------------------
 *
 */
int
Bitmap::readInfoHeader(FILE *fp)
{
    int error = 0;
    const size_t numobject = 1;
    
    size_t result = fread(&mInfoHeader, sizeof(mInfoHeader), numobject, fp);
    if (numobject != result) {
        error++;
    }
    
    return error;    
}

/*-------------------------------------------------------------------------
 *
 */
int
Bitmap::readBitmapData(FILE *fp)
{
    if (mData == 0 || mDataSize == 0) {
        return 1;
    }
    
    size_t result = fread(mData, sizeof(*mData), mDataSize, fp);
    if (mDataSize != result) {
        return 1;
    }
    
    return 0;
}

/*-------------------------------------------------------------------------
 *
 */
int
Bitmap::writeFileHeader(FILE *fp) const
{
    int error = 0;
    const size_t numobject = 1;    
    
    size_t times = fwrite(&mFileHeader, sizeof(mFileHeader), numobject, fp);   
    if (numobject != times) {
        error++;
        return error;
    }
    
    return error;
}

/*-------------------------------------------------------------------------
 *
 */
int
Bitmap::writeInfoHeader(FILE *fp) const
{
    int error = 0;
    const size_t numobject = 1;    
    
    size_t times = fwrite(&mInfoHeader, sizeof(mInfoHeader), numobject, fp);   
    if (numobject != times) {
        error++;
        return error;
    }
    
    return error;
}

/*-------------------------------------------------------------------------
 *
 */
int
Bitmap::writeBitmapData(FILE *fp) const
{
    int error = 0;
    const size_t numobject = mDataSize;

    size_t times = fwrite(mData, sizeof(*mData), mDataSize, fp);
    if (numobject != times) {
        error++;
        return error;
    }

    return error;
}

/*-------------------------------------------------------------------------
 *
 */
void
Bitmap::initFileHeader()
{
    mFileHeader.bfType = 0x4d42;
    mFileHeader.bfSize = 0;
    mFileHeader.bfSize = sizeof(mInfoHeader);
    mFileHeader.bfReserved1 = 0;
    mFileHeader.bfReserved2 = 0;
    mFileHeader.bfOffBits = 54;
}

/*-------------------------------------------------------------------------
 *
 */
void
Bitmap::initInfoHeader()
{
    mInfoHeader.biSize = sizeof(mInfoHeader);
    mInfoHeader.biWidth = 0;
    mInfoHeader.biHeight = 0;
    mInfoHeader.biPlanes = 1;
    mInfoHeader.biBitCount = 24;
    mInfoHeader.biCompression = 0;
    mInfoHeader.biSizeImage = 0;
    mInfoHeader.biXPelsPerMeter = 0;
    mInfoHeader.biYPelsPerMeter = 0;
    mInfoHeader.biClrUsed = 0;
    mInfoHeader.biClrImportant = 0;
}

/*-------------------------------------------------------------------------
 *
 */
unsigned char
Bitmap::getPixelValue(const float val) const
{
    int intval = (int)(val * 255.0f);

    if (intval < 0) {
        intval = 0;
    } else if (intval > 255) {
        intval = 255;
    }   

    return (unsigned char)intval;
}

[bitmap.h]

コード:

// List5.2

/*
 *  Bitmap.h (rev1.1, 28.Nov.2010)
 *  Copyright 2010 Takashi Okuzono. All rights reserved.
 */

#ifndef __BITMAP_H__
#define __BITMAP_H__

#include <stdio.h>
#include "bitmapspec.h"

/*-------------------------------------------------------------------------
 *
 */
class Bitmap {
public:
    Bitmap();
    virtual ~Bitmap();

    void create(const int width, const int height,
                const float* dataR,
                const float* dataG,
                const float* dataB);
    void create(const int width, const int height,
                const unsigned char* dataR,
                const unsigned char* dataG,
                const unsigned char* dataB);
    void createFromBgra(const int width, const int height,
                        const unsigned char* dataBgra);

    void readFile(const char *path);
    void writeFile(const char *path) const;

    void getRgbData(unsigned char* dataR,
                    unsigned char* dataG,
                    unsigned char* dataB) const;
    void getBgraData(unsigned char* dataBgra) const;

    int getWidth() const {return mWidth;}
    int getHeight() const {return mHeight;}
    int getDataSize() const {return mDataSize;}
    int getTotalPixels() const {return mTotalPixels;}

private:
    void initialize(const int width, const int height);

    void fillData(const float* dataR,
                  const float* dataG,
                  const float* dataB);
    void fillData(const unsigned char* dataR,
                  const unsigned char* dataG,
                  const unsigned char* dataB);
    void fillBgraData(const unsigned char *dataBgra);

    int readFileHeader(FILE *ifp);
    int readInfoHeader(FILE *ifp);
    int readBitmapData(FILE *ifp);
    int writeFileHeader(FILE *ofp) const;
    int writeInfoHeader(FILE *ofp) const;
    int writeBitmapData(FILE *ofp) const;
    void initFileHeader();
    void initInfoHeader();

    unsigned char getPixelValue(const float val) const;
    unsigned char getPixelValue(const int val) const;

private:
    BitmapFileHeader mFileHeader;
    BitmapInfoHeader mInfoHeader;

    int mWidth;            // 画面の幅
    int mHeight;           // 画面の高さ
    unsigned char *mData;  // 画像データ
    size_t mDataSize;      // 画像データのサイズ
    size_t mTotalPixels;   // 画面のピクセル数
};

#endif // __BITMAP_H__

[Bitmapspec.h]

コード:

/ List5.1

/*
 *  bitmapspec.h (rev1.1, 28.Nov.2010)
 *  Copyright 2010 Takashi Okuzono All rights reserved.
 */

#ifndef __BITMAPSPEC_H__
#define __BITMAPSPEC_H__

typedef char  MyBYTE;   // 1byte
typedef short MyWORD;   // 2byte
typedef int   MyDWORD;  // 4byte
typedef int   MyLONG;   // 4byte

#pragma pack(push, 1)

typedef struct {
    MyWORD   bfType;
    MyDWORD  bfSize;
    MyWORD   bfReserved1;
    MyWORD   bfReserved2;
    MyDWORD  bfOffBits;
} BitmapFileHeader;

typedef struct {
    MyDWORD  biSize;
    MyLONG   biWidth;
    MyLONG   biHeight;
    MyWORD   biPlanes;
    MyWORD   biBitCount;
    MyDWORD  biCompression;
    MyDWORD  biSizeImage;
    MyLONG   biXPelsPerMeter;
    MyLONG   biYPelsPerMeter;
    MyDWORD  biClrUsed;
    MyDWORD  biClrImportant;
} BitmapInfoHeader;

#pragma pack(pop)

#endif // __BITMAPSPEC_H__

[MyError.h]

コード:

// List5.4

/*
 *  MyError.h (rev1.1, 28.Nov.2010)
 *  Copyright 2010 Takashi Okuozno All rights reserved.
 */

#ifndef __MY_ERROR_H__
#define __MY_ERROR_H__

#include <string>

class MyError {
 public:
    MyError(const std::string & msg,
            const std::string & function = "") {mMsg = msg + " " + function;}
    virtual ~MyError() {};

    const std::string message() const {return mMsg;}
    const char * cstr() const {return mMsg.c_str();}

 private:
    std::string mMsg;
};

#endif // __MY_ERROR_H__
です。よろしくお願いいたします。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#2

投稿記事 by beatle » 14年前

c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\MyError.h
c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\Bitmap.h
というファイル構成になっていますか?

ちなみに,C++では連続するアンダースコアを含む名前は予約されていますので,
#ifndef __MY_ERROR_H__
は規格的にはアウトです.
参考:C/C++ アンダースコアは予約

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#3

投稿記事 by kuro » 14年前

beatle さんが書きました:c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\MyError.h
c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\Bitmap.h
というファイル構成になっていますか?
いいえ、visual studio 2008\projects\bitmapにはありませんでした。
beatle さんが書きました:ちなみに,C++では連続するアンダースコアを含む名前は予約されていますので,
#ifndef __MY_ERROR_H__
は規格的にはアウトです.
参考:C/C++ アンダースコアは予約
ということは、#ifndef __BITMAP_H__ も #ifndef __BITMAPSPEC_H__ も規格的にはアウトなのでしょうか?

[追記]
サイトを見たのですが、
#ifndef __MY_ERROR_H__

#ifndef _MY_ERROR_H_
とすればよいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#4

投稿記事 by softya(ソフト屋) » 14年前

両端のアンダースコアとダブルダンダースコアは非推奨です。ただ、この場合は一時保留しておきましょう。悪い例ということで自分ではやらないようにしてください。
説明が省略されているBitmap.cppとBitmap.h と Bitmapspec.h と MyError.h が置かれているフォルダが重要問題なので、新しく作ったプロジェクトのフォルダにコピーしてから追加していますか? ちなみに新しく作ったプロジェクトのフォルダはソリューションエクスプローラからプロジェクト名で右クリックすると「エクスプローラでフォルダを開く」があるので開くことが出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#5

投稿記事 by kuro » 14年前

softya(ソフト屋) さんが書きました:説明が省略されているBitmap.cppとBitmap.h と Bitmapspec.h と MyError.h が置かれているフォルダが重要問題なので、新しく作ったプロジェクトのフォルダにコピーしてから追加していますか? ちなみに新しく作ったプロジェクトのフォルダはソリューションエクスプローラからプロジェクト名で右クリックすると「エクスプローラでフォルダを開く」があるので開くことが出来ます。
「エクスプローラでフォルダを開く」を見つけきれなかったのですが、Bitmap.cppとBitmap.h と Bitmapspec.h と MyError.h はマイドキュメントにあります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#6

投稿記事 by softya(ソフト屋) » 14年前

kuro さんが書きました:
softya(ソフト屋) さんが書きました:説明が省略されているBitmap.cppとBitmap.h と Bitmapspec.h と MyError.h が置かれているフォルダが重要問題なので、新しく作ったプロジェクトのフォルダにコピーしてから追加していますか? ちなみに新しく作ったプロジェクトのフォルダはソリューションエクスプローラからプロジェクト名で右クリックすると「エクスプローラでフォルダを開く」があるので開くことが出来ます。
「エクスプローラでフォルダを開く」を見つけきれなかったのですが、Bitmap.cppとBitmap.h と Bitmapspec.h と MyError.h はマイドキュメントにあります。
ソースとヘッダは新しく作ったプロジェクトのフォルダに必ず移して下さい。
プロジェクトは特に指定していないとマイドキュメントの中にあるので、Visual Studio 2008/Projectsを探してもらえばあると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#7

投稿記事 by kuro » 14年前

softya(ソフト屋) さんが書きました:ソースとヘッダは新しく作ったプロジェクトのフォルダに必ず移して下さい。
プロジェクトは特に指定していないとマイドキュメントの中にあるので、Visual Studio 2008/Projectsを探してもらえばあると思います。
projectの中にBitmap.h と Bitmapspec.h と MyError.h が無かったので、1度 Bitmap というプロジェクトを削除して、新しく list5.1.2.3.4 というプロジェクトを作り、main.cppをダウンロードしたファイルからBitmap.cppを追加して、ヘッダファイルに新しくBitmap.h と Bitmapspec.h と MyError.hを作り、プログラムをそれぞれコピーして貼り付けてビルドしたところ、

1>------ ビルド開始: プロジェクト: list5.1.2.3.4, 構成: Debug Win32 ------
1>コンパイルしています...
1>Bitmap.cpp
1>c:\users\kuro\documents\samples_sjis_dos\samples_sjis_dos\chapter5\bitmap\bitmap.cpp(12) : fatal error C1083: include ファイルを開けません。'MyError.h': No such file or directory
1>ビルドログは "file://c:\Users\kuro\Documents\Visual Studio 2008\Projects\list5.1.2.3.4\list5.1.2.3.4\Debug\BuildLog.htm" に保存されました。
1>list5.1.2.3.4 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

となりました。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#8

投稿記事 by beatle » 14年前

#include "B.h"
という行を,A.cppに書いたとしましょう.
この場合,B.hはA.cppと同じディレクトリ,または標準ヘッダファイルが存在するディレクトリに存在しなければなりませんが,そうなっていますか?
つまり
c:\users\kuro\documents\samples_sjis_dos\samples_sjis_dos\chapter5\bitmap\MyError.h
となっている必要があります.チェックして,もし違っていたらMyError.hをコピーするか,逆にMyError.hがあるディレクトリにBitmap.cppをコピーしてください.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#9

投稿記事 by softya(ソフト屋) » 14年前

Bitmap.cppがBitmap.h と Bitmapspec.h と MyError.h と同じ場所にないのが原因だと思います。
追加はコピーではないので場所は移動しません。
softya(ソフト屋) さんが書きました:ソースとヘッダは新しく作ったプロジェクトのフォルダに必ず移して下さい。
とは実際にファイルコピーするという意味です。VC++のメニュー上でただ追加するだけではありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#10

投稿記事 by kuro » 14年前

新しく list5.1.2.3.4 というプロジェクトを作って、main.cppをダウンロードしたファイルからBitmap.cppを追加して、Bitmap.h と Bitmapspec.h と MyError.hをプログラムをそれぞれコピーして貼り付けてビルドしたので、
Visual Studio 2008\Projects\list5.1.2.3.4\list5.1.2.3.4
には、
VC++ Project で、list5.1.2.3.4
C/C++ Header で、Bitmap.h と Bitmapspec.h と MyError.h
はあったのですが、
C++ Source で、Bitmap.cpp
が無かったので、ダウンロードしたファイルから、Bitmap.cppをコピーして貼り付けたのですが、エラーは変わらずでした。

これだと、ソースとヘッダは新しく作ったプロジェクトのフォルダに存在する、ということにはならないのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#11

投稿記事 by softya(ソフト屋) » 14年前

エクスプローラでみてVisual Studio 2008\Projects\list5.1.2.3.4\list5.1.2.3.4のフォルダにBitmap.h と Bitmapspec.h と MyError.hとBitmap.cppをファイルコピーして、そのコピーが終わってからVC++でプロジェクトに追加したのなら問題ないです。順番が違うと怪しいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#12

投稿記事 by kuro » 14年前

[quote="softya(ソフト屋)]エクスプローラでみてVisual Studio 2008\Projects\list5.1.2.3.4\list5.1.2.3.4のフォルダにBitmap.h と Bitmapspec.h と MyError.hとBitmap.cppをファイルコピーして、そのコピーが終わってからVC++でプロジェクトに追加したのなら問題ないです。順番が違うと怪しいです。[/quote]

この順序でやっていない気がします・・・
この順序でやってみます。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#13

投稿記事 by ISLe » 14年前

kuro さんが書きました:1>------ ビルド開始: プロジェクト: list5.1.2.3.4, 構成: Debug Win32 ------
1>コンパイルしています...
1>Bitmap.cpp
1>c:\users\kuro\documents\samples_sjis_dos\samples_sjis_dos\chapter5\bitmap\bitmap.cpp(12) : fatal error C1083: include ファイルを開けません。'MyError.h': No such file or directory
1>ビルドログは "file://c:\Users\kuro\Documents\Visual Studio 2008\Projects\list5.1.2.3.4\list5.1.2.3.4\Debug\BuildLog.htm" に保存されました。
1>list5.1.2.3.4 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
↑のエラーメッセージの下線を引いたところにちゃんとファイルの場所が書かれていますよ。
プロジェクトの場所(c:\Users\kuro\Documents\Visual Studio 2008\Projects\list5.1.2.3.4の中)ではありませんね。

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#14

投稿記事 by kuro » 14年前

新しくBitmapというプロジェクトを作り、Visual Studio 2008\Projects\list5.1.2.3.4\list5.1.2.3.4のフォルダにBitmap.h と Bitmapspec.h と MyError.hとBitmap.cppをファイルコピーして、そのコピーが終わってからVC++でプロジェクトに追加し、ビルドすると、

1>------ ビルド開始: プロジェクト: Bitmap, 構成: Debug Win32 ------
1>コンパイルしています...
1>Bitmap.cpp
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmapspec.h(1) : error C2059: 構文エラー : '/'
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(21) : error C2065: 'MyBYTE' : 定義されていない識別子です。
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(21) : error C2070: ''unknown-type'': sizeof オペランドが正しくありません。
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(168) : warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(176) : warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(199) : warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(254) : warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(272) : warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
1>ビルドログは "file://c:\Users\kuro\Documents\Visual Studio 2008\Projects\Bitmap\Bitmap\Debug\BuildLog.htm" に保存されました。
1>Bitmap - エラー 3、警告 5
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

と出たので、
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmapspec.h(1) : error C2059: 構文エラー : '/'
これはすぐ対処し、もう1度ビルドすると、

1>------ ビルド開始: プロジェクト: Bitmap, 構成: Debug Win32 ------
1>コンパイルしています...
1>Bitmap.cpp
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(168) : warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(176) : warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(199) : warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(254) : warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
1>c:\users\kuro\documents\visual studio 2008\projects\bitmap\bitmap\bitmap.cpp(272) : warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
1>マニフェストをリソースにコンパイルしています...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>リンクしています...
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。
1>C:\Users\kuro\Documents\Visual Studio 2008\Projects\Bitmap\Debug\Bitmap.exe : fatal error LNK1120: 外部参照 1 が未解決です。
1>ビルドログは "file://c:\Users\kuro\Documents\Visual Studio 2008\Projects\Bitmap\Bitmap\Debug\BuildLog.htm" に保存されました。
1>Bitmap - エラー 2、警告 5
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

と出ました。

1>MSVCRTD.lib(crtexe.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。
1>C:\Users\kuro\Documents\Visual Studio 2008\Projects\Bitmap\Debug\Bitmap.exe : fatal error LNK1120: 外部参照 1 が未解決です。

の解決法が全く分かりませんでした。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#15

投稿記事 by みけCAT » 14年前

このサンプルプログラムは、Bitmapクラスだけしかなく、それを使うメインのプログラムが無いのではないでしょうか?
Bitmapクラスを使う適当なプログラムをmain関数で定義し、
別のソースコードに保存して(このソースコードは同じプロジェクトに入れる)コンパイルしてみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#16

投稿記事 by kuro » 14年前

みけCAT さんが書きました:このサンプルプログラムは、Bitmapクラスだけしかなく、それを使うメインのプログラムが無いのではないでしょうか?
Bitmapクラスを使う適当なプログラムをmain関数で定義し、
別のソースコードに保存して(このソースコードは同じプロジェクトに入れる)コンパイルしてみてください。
サンプルプログラムに、Bitmapクラスを使うマンデルブロ集合を計算するアプリケーションを作成するプログラムがあったので、それを実行しようとしたのですが、ダウンロードしたファイルの中に、calc.cl (CL ファイル)というものがありました。
恐らく、カーネルプログラムのソースコードだと思うのですが、calc.clは、エクスプローラー上で開こうとしても、開けず、VC++でソースプログラムで追加させてプログラムを表示させると、普通、int や float という文字が青色で表示されるのに、calc.cl では全て黒色でした。
これは何か問題があるのでしょうか?
zipを張りますので、教えて頂けないでしょうか?
添付ファイル
Mandelbrot.zip
(869 KiB) ダウンロード数: 124 回

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#17

投稿記事 by beatle » 14年前

勘ですが,calc.clはGPUに転送して使うためのOpenCLで書かれたソースコードではないでしょうか.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#18

投稿記事 by softya(ソフト屋) » 14年前

書籍に解説があると思うのですが.clはGPUで実行するためのプログラムコードです。
Visualc++ではなくCUDA自体がコンパイルするのでVisualc++では管理できないコードになっています。

[追記]
サンプルを次々と実行しているみたいですが理解しながら進まないと意味が無いと思いますよ。
.clを自分で書けないとOpenCLをやっている意味がありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#19

投稿記事 by kuro » 14年前

すみません。サンプルを実行していって、動作が確認されてから、なぜ、どうして動くのか?と考える、という順序でOpenCLを理解しようとしていたのですが・・・
今までmain.cppだけのプログラムを扱っていたので、初めて.cl が出てくるプログラムに触れたので、混乱してしまいました。

そこで改めて質問よろしいでしょうか?

.clというのはカーネルとして実行させるソースプログラム、というのは書籍で確認、理解しましたが、実際のプログラムにおいて、リソースファイルとして配置すればよいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#20

投稿記事 by softya(ソフト屋) » 14年前

リソースにしなくてもファイルのままで良いのでは?
参考例もファイルのままに成っているみたいですし、リソース処理関係の関数がOpenCLにあるかもよく知りません。
リソース化の例があるなら挑戦しても良いと思いますが書籍の内容がわからないので答えにくいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#21

投稿記事 by kuro » 14年前

実行結果が、

fopen: No such file or directory
file: ../../calc.cl
Error: kernel program file open failed. ClHelper::loadProgramSource
Error: failed to load compute program from file. ClHelper::preloadProgram
続行するには何かキーを押してください . . .

となっていて、恐らく、calc.cl が見つかってないのではないかと思うのですけれど・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#22

投稿記事 by softya(ソフト屋) » 14年前

file: ../../calc.cl
相対パス指定に成っているので、calc.clの場所に合わせて書き換えをして下さい。
基準となるパスは拡張子vcprojがあるフォルダです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#23

投稿記事 by kuro » 14年前

拡張子vcprojがあるフォルダに全てコピーしたので、同一のフォルダにあるということになるので、
相対パスは、そのまま、
calc.cl
でいいんでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#24

投稿記事 by softya(ソフト屋) » 14年前

kuro さんが書きました:拡張子vcprojがあるフォルダに全てコピーしたので、同一のフォルダにあるということになるので、
相対パスは、そのまま、
calc.cl
でいいんでしょうか?
そういう試してみれば分かることは、まず試してみましょう。聞くよりも早いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#25

投稿記事 by kuro » 14年前

恐らく、

void
ClHelper::preloadProgram(const char* filename)
{
cl_int status;
char *source = 0;

// ファイルからプログラムを読み込む
try {
source = loadProgramSource(filename);
} catch (MyError err) {
fprintf(stderr, "Error: %s\n", err.cstr());
throw MyError("failed to load compute program from file.", __FUNCTION__);
}

この部分がおかしいと思い、

ClHelper::preloadProgram(const char* filename ="calc.cl");

としてみたのですが、うまくいきませんでした。

他にもいろいろ試したのですが、多分、filenameとしか書かれていないので、calc.clが見つからないと考えたのですけれど、どうやってfilenameにcalc.clを繋げればよいのかが分かりませんでした。

[追記]
void
ClHelper::preloadProgram(const char* filename)
{
cl_int status;
char *source = 0;
     filename = "calc.cl";

// ファイルからプログラムを読み込む
try {
source = loadProgramSource(filename);
} catch (MyError err) {
fprintf(stderr, "Error: %s\n", err.cstr());
throw MyError("failed to load compute program from file.", __FUNCTION__);
}

と変更して実行させると、

続行するには何かキーを押してください . . .

とだけ表示されて、何も表示されませんでした。
最後に編集したユーザー kuro on 2012年2月05日(日) 21:00 [ 編集 1 回目 ]

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#26

投稿記事 by beatle » 14年前

preloadProgram関数を呼び出している部分を見つけて,そこを改造すればいいだけです.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: OpenCLのサンプルプログラムがうまくいきません。

#27

投稿記事 by softya(ソフト屋) » 14年前

プログラムがどうなっている分からないので試すとしたら
./calc.cl
でしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kuro
記事: 47
登録日時: 14年前

Re: OpenCLのサンプルプログラムがうまくいきません。

#28

投稿記事 by kuro » 14年前

結局、数日かけていろいろいじってみたのですが、このサンプルはうまくいきませんでした。
やっぱり自分でプログラムを作ってOpenCLを学びたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る