|
The compiler is trying to link to managed code ... see the 4 different definitions of beginthreadex
_beginthread, _beginthreadex[^]
You are probably compiling with the managed code probably because you have clr compilation turned on.
pull down menu .... debug -> program name properties -> general tab -> No Common Language Runtime Support
Turn it to "No Common Language Runtime Support"
If you dont understand managed vs native code
Difference between managed and unmanaged code[^]
Now the funny part if you do need managed code you will have to shim the shim ... yes an irony but the pointer that is being passed has to be converted. If you can't work it out drop me a line and I will do it for you.
In vino veritas
modified 18-Apr-18 3:53am.
|
|
|
|
|
Thank again Leon.
Seems like anything I change in the compiler just makes things 1000 times worse. I looks like there is going to be no easy way to get this to work and I may have to take a couple of classes to get up to speed.
Thanks for all your time and thorough answers.
Jim
|
|
|
|
|
No it's not that hard it means your code contains managed code (that is all the pointers are garbage collected), so put the settings back. I can't tell because I have no idea what the code itself looks like or does you just gave us a small piece.
So all the issue is that you have managed code and you need the pointer to be passed to beginthreadex to be a managed pointer and if you want me to create the shim I can.
In vino veritas
|
|
|
|
|
I really wish I didn't have to keep dragging this one, but I still don't know why this won't work.
It worked perfectly fine in VS2005, but now I can't make a thread? Doesn't make sense.
From what I have learned the original code was built with /CLR:pure or managed. I've tried to remove this but the error are so extensive I don't think I would ever get through them.
Is there another function I can use to create the thread? Or some other way to get this thread to run without rewriting the whole thing?
Any help would be much appreciated.
This is where I'm at now:
#include "Connection.h"
#include "Packet.h"
#include "Opcodes.h"
using Ig::Connection;
using Ig::CriticalSection;
using namespace Ig;
CriticalSection::CriticalSection()
{
...
Connection::Connection()
{
...
}
Connection::~Connection()
{
// Wait for the thread to exit.
exitThreads();
// Clear any pending opcodes.
clearPendingOpcodes();
}
bool Connection::open(const char* ip, const int port, const int timeOut)
{
// Make sure the threads are not already running.
exitThreads();
// Setup the ports
// Setup the sockets.
// Set the receive socket timeout.
// Set up the send address.
// Setup the receive address
// Change the state to connecting
// Connect to the sender address.
if (::connect(m_sendSocket, (sockaddr *)&m_sendAddress, sizeof(m_sendAddress)) == SOCKET_ERROR)
{
int error = WSAGetLastError();
closesocket(m_sendSocket);
return false;
}
// Bind to the receiver address.
if (::bind(m_receiveSocket, (sockaddr *)&m_receiveAddress, sizeof(m_receiveAddress)) == SOCKET_ERROR)
{
int error = WSAGetLastError();
closesocket(m_sendSocket);
closesocket(m_receiveSocket);
return false;
}
// Clear pending opcodes.
clearPendingOpcodes();
// Start the threads
// THIS IS WHERE ALL MY PROBLEMS BEGIN!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// //
m_sendThread = (HANDLE)_beginthreadex(NULL, 0, sendData, this, 0, &this->m_sendThreadId);
m_receiveThread = (HANDLE)_beginthreadex(NULL, 0, receiveData, this, 0, &this->m_receiveThreadId);
return true;
}
unsigned int Connection::sendData(void* param)
{
bool request_thread_exit = false;
ConnectionState state = Connection::connecting;
// The param should be an instance of the connection class.
if (param == 0) return 0;
// Cast it to a connection
Connection* connection = static_cast(param);
// Set the state to connecting.
connection->setState(Connection::connecting);
// Loop until we are told to exit.
while (state != Connection::offline)
{
// Get the current state (thread safe).
state = connection->getState();
// Send data based on the state of the connection.
switch (state)
{
// The connection is offline.
case offline: break;
// Connecting to the Ig.
case connecting: connection->processConnectingState(); break;
// Loading everything.
case loading: connection->processLoadingState(); break;
// Waiting for the Ig to set load flags.
case waiting: connection->processWaitingState(); break;
// Running.
case running: connection->processRunningState(); break;
// Unloading.
case unloading: connection->processUnloadingState(); break;
// Disconnecting.
case disconnecting: connection->processDisconnectingState(); break;
}
// Take a break...
Sleep(15);
}
// Close the socket.
closesocket(connection->m_sendSocket);
return 0;
}
unsigned int Connection::receiveData(void* param)
{
bool request_thread_exit = false;
ConnectionState state = Connection::connecting;
// The param should be an instance of the connection class.
if (param == 0) return 0;
// Cast it to a connection
Connection* connection = static_cast(param);
DWORD lastResponseTime = GetTickCount();
DWORD elapsedTime = 0;
const int max_buffer_size = 66000;
char buffer[max_buffer_size];
DWORD maxTime = (DWORD)connection->getTimeOut();
while (state != Connection::offline)
{
// Get the current state (thread safe).
state = connection->getState();
// Attempt to receive data.
int bytes_received = recv(connection->m_receiveSocket, buffer, max_buffer_size, 0);
if (bytes_received != SOCKET_ERROR)
{
// Update the response time.
lastResponseTime = GetTickCount();
// Process the Response.
connection->processResponse(buffer, bytes_received);
//If the state is connecting, then transition to the loading state.
if (state == Connection::connecting)
connection->setState(Connection::loading);
}
else
{
// Check how long it has been since we have received a response.
// If it has been to long, then transition to the offline state.
elapsedTime = GetTickCount() - lastResponseTime;
// Make sure the timer didn't roll over.
if (elapsedTime maxTime && (state > Connection::connecting && state setState(Connection::offline);
}
}
}
// Close the socket.
closesocket(connection->m_receiveSocket);
return 0;
}
void Connection::exitThreads()
{
...
}
}
|
|
|
|
|
|
Leon,
Thank you for all your help with getting this working.
Jim
|
|
|
|
|
Hello all
I am performing multiplication between two square bit-matrices using a specific formula (not the dot product of row/col, I will describe it below). My implementation works correctly but it blows up when I attempt to do tiling in the local memory. Even though I understand the principles behind it (i.e. putting some of my data in local arrays, then using barriers to synchronize my work-items), I keep getting the wrong results.
This is an example of how I setup the matrices:
int N = 256; unsigned long long A = new unsigned long long[n*n/64]; unsigned long long B = new unsigned long long[n*n/64]; int C = new int[n*n]; This is the actual formula:
Row i of matrix A is XORed with row j of matrix B. Yes, it is a row to row operation. Then, I count the number of 1s and assign the sum to C[i][j].
This is how I launch the kernel:
const size_t global[2] = { n, n };
clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global, 0, 0, NULL, &event); This is the actual kernel which works correctly:
__kernel void BitProduct(const int N, const __global ulong* A, const __global ulong* B, __global int* C)
{
const int i = get_global_id(0);
const int j = get_global_id(1);
ulong sum = 0;
for (int k = 0;k < N/64;k++)
sum += popcount( A[ i*(N/64) + k ] ^ B[ j*(N/64) + k ] );
C[ i * N + j ] = (int) sum;
}
|
|
|
|
|
You can't possibly be using that code it's rubbish and it wouldn't even compile
Even if I assume obvious errors what is left is a really dangerous piece of code that has lethal typecast problems that will blowup in your face
First the array definitions are garbage and can't compile like that and n isn't even defined and you need a pointer for a new array. You have a capital N defined which I assume is supposed to be used for the arrays. So my guess what you meant to type is
int n = 256; unsigned long long *A = new unsigned long long [n*n / 64]; unsigned long long *B = new unsigned long long [n*n / 64];
However that just leads us to look at function bitproduct which starts playing around with ulong* pointers.
The usual definition of ulong is an unsigned long which isn't an unsigned long long which the array are created as.
So now I am really confused bitproduct can't be using those arrays because they aren't the right type unless you were
really crazy and forced a typecast at which point all hell breaks out.
So what exactly is a ulong and what is being passed to bitproduct as arrays????
I don't know were to go from there it's a mess.
Now can I make a really strong recommendation to you since you are playing around with fixed bit types that you use the C/C++ standard unit for that.
At the top of your code type
#define <stdint.h>
stdint.h is the standard for fixed width types
<cstdint> (stdint.h) - C++ Reference[^]
Types like long, ints etc are not guaranteed to be a given size on different compilers they vary from compiler to compiler.
However a uint64_t is GUARANTEED to always be exactly 64 bits
I would roll the bit counts into uint16_t
So my guess for sexier and type safe version of what you are doing is
#define <stdint.h>
int n = 256; uint64_t *A = new uint64_t[n*n/64]; uint64_t *B = new uint64_t[n*n/64]; uint16_t *C = new uint16_t[n*n];
_kernel void BitProduct(const int N, const __global uint64_t* A, const __global uint64_t* B, __global uint16_t* C) {
}
In vino veritas
|
|
|
|
|
Hi Leon. Thanks for your input.
To clarify, this is an assignment I am working on.
The arrays were set by the instructor, believe it or not, and I am not allowed to modify them. My job is to setup OpenCL and write a kernel that correctly multiplies the two matrices. I know for a fact that my kernel works correctly because the instructor has provided a function that performs the same calculation on the CPU and then compares the two results.
I have uploaded the VS15 project files at https://uploadfiles.io/
|
|
|
|
|
It isn't valid C++ code ... Are you seriously telling me you can compile these 3 lines of code on Visual Studio?
unsigned long long A = new unsigned long long[n*n/64]; unsigned long long B = new unsigned long long[n*n/64]; int C = new int[n*n];
I don't care what n is I actually don't know a C++ compiler that will take that.
Visual Studio 2017 will report it correctly that it's missing an all important "*" making it a pointer
Error (active) E0144 a value of type "unsigned long long *" cannot be used to initialize an entity of type "unsigned long long"
Error (active) E0144 a value of type "unsigned long long *" cannot be used to initialize an entity of type "unsigned long long"
Error (active) E0144 a value of type "int *" cannot be used to initialize an entity of type "int"
Hence I am still favouring you have typed it wrong because you would be complaining of those errors and I can't believe a lecturer would write that.
Your link isn't correct so I can't look at what I suspect is the real code.
Are you allowed to change BitProduct function to
__kernel void BitProduct(const int N, const __global unsigned long long* A, const __global unsigned long long* B, __global int* C)
That might give you a fighting chance other than that I am pretty sure you are wasting your time and go talk to lecturer.
In vino veritas
modified 20-Mar-18 14:10pm.
|
|
|
|
|
|
At least you now agree you have typo errors which I could only guess at, so we made some progress.
Now can you to go carefully thru the code you typed because there are more errors which I have guessed at
Your code you have posted doesn't appear in the code you have linked so it's really confusing to me what it's relevance?
The code you linked is throwing masses of warnings a couple of them will be fatal if they get called, is this your code or the lecturers?
Lets give you a sample of one of the probably fatal warnings
printf("Program (%d):\n%s\n\n",err,program[p]); The second parameter is listed as a string %s, what is passed in is a cl_program which is a struct AKA nothing like a string
This is one of the problems with vardiac argument calls they are dangerous, the compiler can't be certain it's fatal but like me it's guessing it is may be fatal or at the least very bad and warning about it. So lets deal with how easy this could be fatal, well if the struct contains no zero's bytes printf is treating the struct as a string so it will keep reading past the struct itself and you are going to get a good old memory access fatal error.
So can we start again, either refer directly to the code you linked or type proper valid code for your question.
I don't mind helping but you have to give me proper valid code to look at.
In vino veritas
modified 20-Mar-18 22:01pm.
|
|
|
|
|
All of the warnings are due to the instructor's code. In fact, all of the source code files were provided by the instructor. My task was to modify one of the given functions (in order to setup and launch the kernel) and write the actual kernel.
In spite of the many warnings, were you able to compile and run the code?
|
|
|
|
|
Nope it crashes and burns as you would expect given the warnings.
I wasn't going to debug a whole pile of code which I assumed was your homework.
In vino veritas
|
|
|
|
|
It is strange that you had to assume this was homework when I explicitly stated that it was on more than one occasion.
|
|
|
|
|
You said and I quote it exactly
"To clarify, this is an assignment I am working on."
"The arrays were set by the instructor, believe it or not, and I am not allowed to modify them."
So are you telling me this isn't a homework assignment for a programming unit?
University assignments are about you learning not someone on the network doing them for you. Secondly I am not allowed to correct somethings like the array creation obviously so how would I know what I can and can not correct?
I feel confident any normal person would assume what I have and if it comes as a shock to you well sorry it is logical.
We could go into how you reconcile those statements with it not being a homework assignment but lets just ignore that and move on.
All I can say is the current code crashes and burns beautifully at the moment which is entirely predictable.
So to even help at the moment I need to know what code I am allowed to change and what I can't which you clearly know but I have no clue.
Do you at least see and agree I need to know what is allowed to be changed?
In vino veritas
modified 21-Mar-18 22:52pm.
|
|
|
|
|
1. So what you are telling me is that you thought the term "assignment" DID NOT mean "homework"? My mentioning the instructor didn't help you form the conceptual link between the two terms?
2. I specified that I can make changes to specific portions of the code. It is common for instructors to provide sample code and ask for changes to specific segments.
3. When I encounter a problem that I can't overcome, should I simply give up or try my hand at whatever resources I have at my disposal, including online forums? Do you advocate that I simply give up and not learn at all?
To clarify, I worked out how to do memory tiling in the kernel. Perhaps your unjustifiably obnoxious behaviour helped me solve this and for that I am grateful.
Lastly, you made a big fuss about the memory allocation segment when you could have simply said "Ehm, did you forget the asterisk?". People like you make online forums absolutely TOXIC and you should be ashamed of yourself.
modified 2-Apr-18 4:02am.
|
|
|
|
|
I am not going to make the situation worse but I would like you to go thru it as an exercise
Your Point 1> I still have no idea what you are saying, I think you are objecting to me referring to assignment as homework is that the issue?
Your Point 2> I understood your point but I have no idea what code belongs to your lecturer and which belongs to you?
Your Point 3> No use online forums but remember we are not mind readers, things that may be obvious to you are not to us.
You may care to review the conversation and consider I may not be clear exactly what you are trying to do. I also took the time to write code and give you my best guess at an answer which is hardly the actions of someone trying to be "unjustifiably obnoxious" and I took the time to answer each of your responses.
You may care to review the sticky, points 5 & 11 are very pertinent
HOW TO ASK A QUESTION - C / C++ / MFC Discussion Boards[^]
I actually didn't and still don't know if it was just missing an asterix because there are multiple problems as none of the types matched up. It is the same as structs being rolled in as strings in variadic printf statements, it's hard to work out what was intended. This rolls back to point 5 on the HOW TO ASK A QUESTION sticky.
I am sorry you feel I was being toxic that was definitely not my intent and if that belief spurred you to solve the problem at least that was a positive and hopefully you will be more careful with postings in future.
In vino veritas
modified 3-Apr-18 1:17am.
|
|
|
|
|
Oh ok. I see the mix up. I forgot to add the * in my original post. Of course I am initializing a pointer to dynamically allocated memory.
unsigned long long *A = new unsigned long long[n*n/64];
unsigned long long *B = new unsigned long long[n*n/64];
int C = new int[n*n];
|
|
|
|
|
Well, you should always copy/paste your original code snippets, not just type it here from scratch!
|
|
|
|
|
I am using RHEL6, Qt4.8.5, QTCreator
I am using the command line entry
Quote: soffice --invisible -convert-to csv excelfilename.xls
It works fine but only give me the first spreadsheet tab in the workbook. Does anyone know how to drill down to the subsequent spreadsheets using this command line entry??
Thanks
emp
|
|
|
|
|
|
|
Using any MPI library, how do I configure the settings and build a mpi.h file (Can be a library from the Intel MPI or Open MPI) that I can use with the Linux C++ in VS?
|
|
|
|
|