Results 1 to 5 of 5

Thread: Reading file in OpenCL program

  1. #1
    Junior Member
    Join Date
    Oct 2010
    Posts
    26

    Reading file in OpenCL program

    Hi,
    I have a very weird problem in an OpenCL project, in my program I read a text file at the host and load its contents to memory in order to start processing on it further, (this happens at the very beginning of the program and has nothing to do with GPU function calls; i.e it has nothing to do with parallelism)... I'm working on Visual Studio 2008,
    when I call the 'read' built-in c++ function in 'wifstream', it takes very long time to finish reading the file! However when I create an empty project that reads the same file (not openCL project) it is read much quickly! I measured the file reading time in both programs (OpenCL program & my empty project) I found a huge gap! I'm really astonished from this behavior of the wifstream read function when called from an OpenCL project!!
    any idea why this might happen?

  2. #2
    Junior Member
    Join Date
    Oct 2010
    Posts
    26

    Re: Reading file in OpenCL program

    Can't anybody help me check why this strange behavior happens?!!
    I made a small test to check if the problem is in my code: I copied one of the NVIDIA opencl samples and emptied the code written in it and pasted my code, and I created an empty project and pasted my code... the time taken by the new project to read a text file of size 40 MB was: 49 sec while the time taken to read the same file in the opencl copied sample was: 201 sec!!!

    here's a link of the file I read during this test:
    http://www.4shared.com/file/fXpo_MvP/all.html


    And also here's my code if you want to try it yourself (plz don't forget to change the directory path)...
    Code :
    #include "iostream"
    #include "time.h"
    #include <fstream>
    #include <windows.h>
    #include <string>
    using namespace std;
     
     
    ifstream::pos_type size;
    void listDirFiles(wchar_t*, wstring*, int*);
    void main()
    {
    	wstring filesList[23000];
    	int filesNum=0;
    	string Dir="H:\\++WORK\\ARABIC COLLECTIONS\\Articles\\uni2\\";
    	listDirFiles(L"H:\\++WORK\\ARABIC COLLECTIONS\\Articles\\uni2\\*.txt",filesList, &filesNum);
     
     
    	for(int i =0 ;i<filesNum;i++)
    	{
    		int len =filesList[i].length();
    		char* fileName=(char*)malloc((len+1)*sizeof(char));
    		wcstombs(fileName,filesList[i].c_str(),filesList[i].length());
    		fileName[len]='\0';
     
    		string fname=fileName;
    		string fullPath=Dir+fname;
     
     
    		wifstream file (fullPath.c_str(), ios::in|ios::ate);
    		if (file.is_open())
    		{  
    			size = file.tellg();
    			wchar_t * memblock = new wchar_t [size];
    			file.seekg (0, ios::beg);
    			unsigned t0 = clock();
    			file.read (memblock, size);
    			unsigned t1= clock();
    			cout<<"Time to read file "<<i<< " is: "<<((double)(t1-10)/CLOCKS_PER_SEC)<<endl;
    			file.close();
     
    		}
    	}
    }
    void listDirFiles(wchar_t* dirPath, wstring* fileName, int* filesNum)
    {
     
    	UINT counter(0);
    	bool working(true);
    	wstring buffer;
     
    	WIN32_FIND_DATA myfile;
     
    	HANDLE myHandle=FindFirstFile(dirPath,&myfile);
     
    	if(myHandle!=INVALID_HANDLE_VALUE)
    	{
    		buffer=(wstring)(myfile.cFileName);
    		fileName[counter]=buffer;
    		filesNum[0]++;
     
    		while(working)
    		{
    			FindNextFile(myHandle,&myfile);
    			if(((wstring)myfile.cFileName).compare(buffer)!=0)
    			{
    				buffer=myfile.cFileName;
    				++counter;
    				fileName[counter]=buffer;
    				filesNum[0]++;
    			}
    			else
    			{
    				//end of files reached
    				working=false;
    			}
     
    		}
    	}
    }

  3. #3
    Junior Member
    Join Date
    Oct 2010
    Posts
    26

    Re: Reading file in OpenCL program

    sorry, forgot to mention that the file I'm testing upon is written in Arabic..

  4. #4
    Member
    Join Date
    Mar 2010
    Location
    Raleigh, NC
    Posts
    55

    Re: Reading file in OpenCL program

    No idea yet as to why it may take longer, but at first glance, this line of code looks wrong:

    Code :
    cout<<"Time to read file "<<i<< " is: "<<((double)(t1-10)/CLOCKS_PER_SEC)<<endl;

    I think that should be

    cout<<"Time to read file "<<i<< " is: "<<((double)(t1-t0)/CLOCKS_PER_SEC)<<endl;

    Check that line between both versions of your program.

    OpenCL shouldn't have anything / any interference with reading in a text file.

  5. #5
    Junior Member
    Join Date
    Oct 2010
    Posts
    26

    Re: Reading file in OpenCL program

    Thanks for the reply
    of course this was a mistake BUT still it behaves the same... but I tried working with ifstream instead of wifstream so it worked correctly and the reading time became almost the same in the two versions... I'm really astonished of the strange behavior with wiftream!

Similar Threads

  1. Replies: 0
    Last Post: 11-13-2012, 12:21 AM
  2. Reading a file to make a texture
    By Bruce Sherwood in forum WebGL - General
    Replies: 1
    Last Post: 01-16-2012, 10:52 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •