Чего не хватает в этой стратегии выбора какую коллекцию C # использовать?

Вот моя стратегия выбора типа коллекции C # для использования:

  • , если число элементов в коллекции фиксировано, тогда используйте массив Например:

    string [] directions = new string [] {" ...

    Когда я начал программировать в OpenCL, я использовал следующий подход для предоставления данных своим ядрам:

    cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE, object_size, NULL, NULL);
    clEnqueueWriteBuffer(cl_queue, buff, CL_TRUE, 0, object_size, (void *) object, NULL, NULL, NULL);
    

    Это, очевидно, потребовало, чтобы я разбил свои данные на куски, гарантируя, что каждый кусок будет помещаться в память устройства. После выполнения вычислений я считал данные с помощью clEnqueueReadBuffer (). Однако в какой-то момент я понял, что могу просто использовать следующую строку:

    cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, object_size, (void*) object, NULL);
    

    При этом разбиение данных стало устаревшим. И, к моему удивлению, я испытал огромный прирост производительности. Это то, что я не понимаю. Из того, что я получил, при использовании указателя хоста память устройства работает как кеш, но все данные все еще должны быть скопированы в него для обработки и затем скопированы обратно в основную память после завершения. Почему использование явной копии (clEnqueRead / WriteBuffer) на порядок медленнее, когда, на мой взгляд, это должно быть в основном то же самое? Я что-то пропустил?

    Спасибо.

5
задан benshope 26 June 2013 в 14:15
поделиться