When using Optix Prime to test the visibility of the vertices of a mesh from a specific point i encounter the following exception:
Function "_rtpQueryExecute" caught exception: Encountered a CUDA error:
cudaMemcpyAsync( dst, src, size, cudaMemcpyHostToDevice, m_streams[streamIdx] )
returned (11): invalid argument, [65863812]
I have narrowed this down a bit: The exception occurs with “query->execute(0)” each time the ray buffer set with
query->setRays( nverts, RTP_BUFFER_FORMAT_RAY_ORIGIN_DIRECTION, RTP_BUFFER_TYPE_HOST, rayBuffer );
exceeds 2MB (not GB), i.e. nverts >= 87382. Values below run fine. Any ideas how to fix this?
I am using Win7 x64, VS2008 and a 32bit compiled executable. The simplePrimePP example on the other hand runs fine with much more rays (32bit executable, same VS2008, same system).
My complete code is here:
...
using namespace optix::prime;
//create prime context
Context context = Context::create(RTP_CONTEXT_TYPE_CUDA);
//create model
Model model = context->createModel();
MyMesh& m = getMesh();
model->setTriangles(m.NumBoundaryFaces, RTP_BUFFER_TYPE_HOST, m.FaceVertexIndices, m.NumBoundaryVertices, RTP_BUFFER_TYPE_HOST, m.Vertices, 0);
model->update(RTP_MODEL_HINT_NONE);
unsigned int nverts = m.NumBoundaryVertices;
// create ray buffer
float* rayBuffer = new float[2*3*nverts];
rtpHostBufferLock(rayBuffer, 2*3*nverts*sizeof(float));
// create hit buffer
float* hitBuffer = new float[nverts];
rtpHostBufferLock(hitBuffer, nverts*sizeof(float));
try {
for (...) {
// do sth unrelated
// fill ray origins
float origin[3] = {getPosition().X, getPosition().Y, getPosition().Z};
for (int i=0; i<nverts; ++i) {
memcpy(rayBuffer+(2*3*i), origin, 3*sizeof(float));
}
// fill ray directions
F3Map verts = m.verticesAsMap();
Eigen::Vector3f orig(origin[0], origin[1], origin[2]);
for (int i=0; i<nverts; ++i) {
Eigen::Vector3f direction = (verts.col(i)-orig).normalized();
memcpy(rayBuffer+((2*3*(i))+3), direction.data(), 3*sizeof(float));
}
//create query
Query query = model->createQuery(RTP_QUERY_TYPE_CLOSEST);
query->setRays( nverts, RTP_BUFFER_FORMAT_RAY_ORIGIN_DIRECTION, RTP_BUFFER_TYPE_HOST, rayBuffer );
query->setHits( nverts, RTP_BUFFER_FORMAT_HIT_T, RTP_BUFFER_TYPE_HOST, hitBuffer);
//execute
query->execute( 0 ); // FAILS HERE
//analyze hit buffer
...
}
} catch ( optix::prime::Exception& e ) {
LogErr(QString("An error occurred with error code %1 and message %2").arg(e.getErrorCode()).arg(QString::fromStdString(e.getErrorString())));
}
rtpHostBufferUnlock(rayBuffer);
delete[] rayBuffer;
rtpHostBufferUnlock( hitBuffer );
delete[] hitBuffer;
...