2008-11-06 9 views
5

C# 배열의 하위 집합을 가져 와서 다른 원본 코드 배열로 전달할 수있는 효율적인 방법이 있습니까? 나는 GPU에 배열을 복사하는 기능을 가진 CUDA.net을 사용합니다. 예를 들어 함수를 배열의 10 번째로 전달하여 배열의 각 열 번째를 별도로 GPU에 복사합니다 (파이프 라이닝 목적으로).효율적으로 배열 부분 집합 가져 오기

이렇게 배열을 복사하는 것은 한 번에 복사하는 것보다 효율적이어야합니다. 그것은 안전하지 않은 코드로 할 수 있으며 적절한 메모리 위치를 참조하는 것 외에는 확실하지 않습니다. CopyTo 함수는 전체 배열을 다른 배열에 복사하므로 유용하지 않습니다.

답변

11

좋아, 내가 전에 질문을 오해 것입니다.

원하는 것은 System.Buffer.BlockCopy 또는 System.Array.Copy입니다.

LINQ 방식은 비효율적입니다. 복사하려는 버퍼를 재사용 할 수 있다면 효율을 높이고 매번 새로운 배열을 만들지 않아도됩니다. 맨 위에 복사하면됩니다. "큰"배열을 똑같이 나눌 수 없다면, 마지막 경우를 위해 새로운 배열이 필요합니다.

3

난 당신이 확장 방법 및 수율 반환을 사용할 수

int[] myInts = new int[100]; 

//Code to populate original arrray 

for (int i = 0; i < myInts.Length; i += 10) 
{ 
    int[] newarray = myInts.Skip(i).Take(10).ToArray(); 
    //Do stuff with new array 
} 
0

...이 있지만 얼마나 효율적으로 잘 모르겠어요 :

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex) 
{ 
    for (var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex) 
     yield return array[currentIndex]; 
} 
+0

그게 좋은 형태의 원래 클래스의 API하지만 효율적이지 그게 전부 내게 파업하는 Array.Copy는 훨씬 빠른 것이다. –

+0

어떤면에서 효율적이지 않습니까? 배열의 일부만 반복하고 싶다면 배열을 복사하는 것보다 효율적입니다. –

+0

죄송합니다. 올바른 방법으로 설명해야합니다. iterating을 위해 당신은 맞을지도 모르지만'yield '를 사용할 때 발생하는 많은 작업이 있습니다. 저자의 질문 저자는 배열의 부분 집합을 gpu로 복사하는 방법입니다. 위에서 설명한 방법을 사용할 때 비효율적 인'ToArray()'를 호출해야합니다. 이 방법은 나쁘지는 않지만이 목적을 위해 좋지 않습니다. –

1

바이트 배열에서 관리되지 않는 포인터로 이동해야 할 경우 Marshal.Copy를 시도 할 수 있습니다. 따라서 안전하지 않은 코드를 직접 만들지 않아도됩니다.

편집 : 이것은 API를 다시 구현하는 경우에만 작동합니다. 죄송합니다 - 오해. 당신은 효율적인 하위 배열 방법을 원합니다.

그것은 당신이 정말 원하는 것은 어떤 목적을 위해

void CopyToGpu(byte[] source, int start, int length); 
관련 문제